Skip to content

Commit e5460f3

Browse files
committed
update suave sample
1 parent 9d9bc97 commit e5460f3

File tree

1 file changed

+64
-11
lines changed
  • fsharp/ModelBinding/SuaveSample/src/SuaveSample

1 file changed

+64
-11
lines changed
Lines changed: 64 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,72 @@
11
module SuaveSample
22

33
open System
4-
open System.Threading
54
open 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

Comments
 (0)