Monorepo for Tangled
tangled.org
1package xrpc
2
3import (
4 "fmt"
5 "net/http"
6 "strconv"
7
8 "tangled.org/core/knotserver/db"
9)
10
11func parseListParams(r *http.Request) (db.ListPage, error) {
12 q := r.URL.Query()
13 p := db.ListPage{Limit: db.ListDefaultLimit, Desc: true}
14
15 if s := q.Get("limit"); s != "" {
16 n, err := strconv.Atoi(s)
17 if err != nil {
18 return p, fmt.Errorf("limit must be an integer")
19 }
20 p.Limit = min(max(n, 1), db.ListMaxLimit)
21 }
22
23 if s := q.Get("cursor"); s != "" {
24 n, err := strconv.Atoi(s)
25 if err != nil {
26 return p, fmt.Errorf("cursor must be an integer")
27 }
28 p.Cursor = &n
29 }
30
31 switch q.Get("order") {
32 case "", "desc":
33 p.Desc = true
34 case "asc":
35 p.Desc = false
36 default:
37 return p, fmt.Errorf("order must be 'asc' or 'desc'")
38 }
39
40 return p, nil
41}
42
43func mapSlice[T, U any](items []T, f func(T) U) []U {
44 out := make([]U, len(items))
45 for i, it := range items {
46 out[i] = f(it)
47 }
48 return out
49}