extensible/Servant
【型レベルWeb DSL】 Servantの紹介 の Todo リストの例を extensible で書き直すと以下のようになる。
mock サーバーとしてランダムな値を返す例
code: (hs)
#!/usr/bin/env stack
{- stack script
--resolver lts-12.11
--package extensible
--package servant-mock
--package servant-server
--package warp
-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE OverloadedLabels #-}
module Main where
import Data.Extensible
import Servant
import Servant.Mock
import qualified Network.Wai.Handler.Warp as Warp
type Todo = Record
'[ "todoId" >: Int
, "title" >: String
, "done" >: Bool
]
type API = "todo" :> "all" :> Get 'JSON Todo
api :: Proxy API
api = Proxy
main :: IO ()
main = do
putStrLn "Listening on port 8080"
Warp.run 8080 $ serve api (mock api Proxy)
実行結果
code: (shell)
λ> curl http://localhost:8080/todo/all
[{"done":false,"todoId":-22,"title":"AQ>UfC陌N"},{"done":false,"todoId":-8,"title":"am\u0010\nS䱑S\u001b*8\u0008V(\u0013\u0002L6\"yNㅏp"},...
Todo リストを返す例
code: (hs)
#!/usr/bin/env stack
{- stack script
--resolver lts-12.11
--package extensible
--package servant-server
--package warp
-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE OverloadedLabels #-}
module Main where
import Data.Extensible
import Servant
import qualified Network.Wai.Handler.Warp as Warp
type Todo = Record
'[ "todoId" >: Int
, "title" >: String
, "done" >: Bool
]
type API = "todo" :> "all" :> Get 'JSON Todo
api :: Proxy API
api = Proxy
todoList :: Todo
todoList =
[ #todoId @= 1 <: #title @= "アドベントカレンダーを書く" <: #done @= True <: nil
, #todoId @= 2 <: #title @= "Haskellで仕事する" <: #done @= False <: nil
, #todoId @= 3 <: #title @= "寝る" <: #done @= False <: nil
]
server :: Server API
server = pure todoList
main :: IO ()
main = do
putStrLn "Listening on port 8080"
Warp.run 8080 $ serve api server
実行結果
code: (shell)
λ> curl http://localhost:8080/todo/all
{"done":true,"todoId":1,"title":"アドベントカレンダーを書く"},{"done":false,"todoId":2,"title":"Haskellで仕事する"},{"done":false,"todoId":3,"title":"寝る"}