11module SuaveSample
22
33open System
4- open System.Threading
54open Suave
5+ open Suave.Operators
6+ open Suave.Filters
7+ open FsConfig
68
7- [<EntryPoint>]
8- let main argv =
9- let cts = new CancellationTokenSource()
10- let conf = { defaultConfig with cancellationToken = cts.Token }
11- let listening , server = startWebServerAsync conf ( Successful.OK " Hello World" )
9+ type DealsCategory =
10+ | AllDeals
11+ | AllEBooks
12+ | ActionAndAdventure
13+ | Media
14+ | Fiction
15+
16+ type Language =
17+ | English
18+ | Hindi
19+ | Tamil
20+
21+ type Rating =
22+ | Five
23+ | FourAndAbove
24+ | ThreeAndAbove
25+
26+ type SearchFilter = {
27+ Language : Language list
28+ Rating : Rating option
29+ }
30+
31+ type Search = {
32+ Category : DealsCategory
33+ Filter : SearchFilter
34+ }
35+
36+ let queryStringsMap ( request : HttpRequest ) =
37+ request.query
38+ |> List.groupBy fst
39+ |> List.map ( fun ( x , keyVals ) ->
40+ ( x, keyVals |> List.map snd |> List.choose id |> String.concat " ," ))
41+ |> Map.ofList
1242
13- Async.Start( server, cts.Token)
14- printfn " Make requests now"
15- Console.ReadKey true |> ignore
43+ type HttpQueryStringsProvider ( request : HttpRequest ) =
44+ let queryStringsMap = queryStringsMap request
1645
17- cts.Cancel()
46+ interface IConfigReader with
47+ member __.GetValue name =
48+ Map.tryFind name queryStringsMap
1849
19- 0 // return an integer exit code
50+ let private camelCaseCanonicalizer _ ( name : string ) =
51+ name
52+ |> String.mapi ( fun i c ->
53+ if ( i = 0 ) then Char.ToLowerInvariant c else c)
54+
55+ let bindQueryStrings < 'T > ( request : HttpRequest ) =
56+ let queryStringsProvider = new HttpQueryStringsProvider( request)
57+ parse< 'T> queryStringsProvider camelCaseCanonicalizer " "
58+ |> Result.mapError ( fun e -> e.ToString())
59+
60+ let getBooks ctx = async {
61+ let search = bindQueryStrings< Search> ctx.request
62+ printfn " %A " search
63+ return ! Successful.OK " Todo" ctx
64+ }
65+
66+ let app =
67+ path " /books" >=> getBooks
68+
69+ [<EntryPoint>]
70+ let main argv =
71+ startWebServer defaultConfig app
72+ 0 // return an integer exit code
0 commit comments