@@ -9,10 +9,15 @@ open FSharp.Data
99#r " packages/FSharp.Data/lib/net45/FSharp.Data.dll"
1010#r " packages/Http.fs/lib/net461/HttpFs.dll"
1111#r " packages/System.Net.Http/lib/net46/System.Net.Http.dll"
12+ #r " packages/Suave/lib/net40/Suave.dll"
1213
1314open Hopac
1415open FSharp.Data
1516open HttpFs.Client
17+ open Suave
18+ open Suave.Successful
19+ open Suave.Filters
20+ open System.Threading
1621
1722type UserTypeProvider = JsonProvider< " https://api.github.com/users/tamizhvendan" >
1823type User = UserTypeProvider.Root
@@ -144,6 +149,8 @@ type UserDto = {
144149 " avatarUrl" , JsonValue.String u.AvatarUrl
145150 " topThreeRepos" , topThreeRepos
146151 |]
152+ static member ToJsonString ( u : UserDto ) =
153+ UserDto.ToJson( u) .ToString()
147154
148155let repoDto ( repo : Repo ) languages = {
149156 Name = repo.Name
@@ -171,9 +178,45 @@ let getUserDto username = job {
171178 }
172179}
173180
174- #time " on"
175- getUserDto " haf"
176- |> Job.map ( UserDto.ToJson)
177- |> Job.map ( fun x -> x.ToString())
178- |> run
179- #time " off"
181+
182+ open Suave.Operators
183+
184+ let getUserApi username ctx = async {
185+ let! userDtoResponse =
186+ getUserDto username
187+ |> Job.catch
188+ |> Job.toAsync
189+ match userDtoResponse with
190+ | Choice1Of2 userDto ->
191+ let res =
192+ userDto
193+ |> UserDto.ToJsonString
194+ |> OK
195+ >=> Writers.setMimeType " application/json; charset=utf-8"
196+ return ! res ctx
197+ | Choice2Of2 ex ->
198+ printfn " %A " ex
199+ return ! ServerErrors.INTERNAL_ ERROR " something went wrong" ctx
200+ }
201+
202+ let app = pathScan " /api/profile/%s " getUserApi
203+
204+ let startServer () =
205+ let cts = new CancellationTokenSource()
206+ let listening , server =
207+ startWebServerAsync defaultConfig app
208+ Async.Start( server, cts.Token) |> ignore
209+ Async.RunSynchronously listening |> ignore
210+ cts
211+
212+ let stopServer ( cts : CancellationTokenSource ) =
213+ cts.Cancel true
214+ cts.Dispose()
215+
216+
217+ // #time "on"
218+ // getUserDto "haf"
219+ // |> Job.map (UserDto.ToJson)
220+ // |> Job.map (fun x -> x.ToString())
221+ // |> run
222+ // #time "off"
0 commit comments