0 | module HTTP.API.Server.Query
 1 |
 2 | import Data.List
 3 | import HTTP.API.Server.Interface
 4 |
 5 | %default total
 6 |
 7 | convertQ :
 8 |      (fs : List QField)
 9 |   -> All Decode (QueryConstraintTypes fs)
10 |   -> Queries
11 |   -> Either DecodeErr (HList (QueryTypes fs))
12 | convertQ []               []        qs = Right []
13 | convertQ ((n ?? t) :: xs) (y :: ys) qs = Prelude.do
14 |   let Just (QVal bs) := lookup n qs
15 |         | Nothing     => Left (Msg "Missing query parameter: '\{n}'")
16 |         | Just QEmpty => Left (Msg "Missing query value: '\{n}'")
17 |   v  <- decodeAs t bs
18 |   vs <- convertQ xs ys qs
19 |   Right $ v::vs
20 | convertQ (QBool n :: xs) ys qs = Prelude.do
21 |   vs <- convertQ xs ys qs
22 |   Right $ isJust (lookup n qs) :: vs
23 |
24 | public export
25 | Serve ReqQuery where
26 |   InTypes q               = QueryTypes q.fields
27 |   OutTypes _              = []
28 |   Constraint q            = All Decode (QueryConstraintTypes q.fields)
29 |   outs q                  = []
30 |   canHandle _ r           = True
31 |   adjResponse _ _ _       = pure
32 |   fromRequest q r         =
33 |     either
34 |       (throw . decodeErr badRequest400)
35 |       pure
36 |       (convertQ q.fields con r.uri.queries)
37 |
38 |