, , - Haskell. warp, wai acid-state. , .
, , , , IO, , IO. IO, . . GHCI :
> let myStrangeId x = let _ = print "Haskell is fun!" in x
:
>:t myStrangeId
myStrangeId :: a -> a
:
> myStrangeId "Hello"
"Hello"
, , . , let, , . registerUser.
, , , IO, IO . , , , IO, . haskell, IO .
Application Wai, , :
type Application = Request -> IO Response
, , . , Response IO .
, authRoutes. :
authRoutes :: AcidState UserDatabase -> Request -> [Text.Text] -> String -> Response
, , Response IO Response:
authRoutes :: AcidState UserDatabase -> Request -> [Text.Text] -> String -> IO Response
- IO . IO , return :: a -> IO a . , return = . , loginUser registerUser IO Response, . :
authRoutes :: AcidState UserDatabase -> Request -> [Text.Text] -> String -> IO Response
authRoutes db request path body =
case path of
("register":rest) -> registerUser db (decode (LB.pack body) :: Maybe (Map.Map String String))
("login":rest) -> loginUser db body
("access":rest) -> return $ resPlain status404 "Not implemented."
_ -> return $ resPlain status404 "Not Found."
, return resPlain, IO.
registerUser. , . , nextRandom , : nextRandom :: IO something, :
registerUser :: AcidState UserDatabase -> Maybe (Map.Map String String) -> IO Response
registerUser db maybeUserMap =
case maybeUserMap of
(Just u) -> do
uuid <- nextRandom
update db (StoreUser (toString uuid) u)
return $ resPlain status200 (toString uuid)
Nothing -> return $ resPlain status401 "Invalid user JSON."
loginUser :
loginUser :: AcidState UserDatabase -> String -> IO Response
loginUser db username = do
maybeUserMap <- query db (FetchUser username)
case maybeUserMap of
(Just u) -> return $ resJSON u
Nothing -> return $ resPlain status401 "Invalid username."
, , IO , IO. -IO IO. IO , . IO , , return . , loginUser IO, , .
Edit:
, , Wai :
type Application = Request -> (Response -> IO ResponseReceived) -> IO ResponseReceived
, .
IO Response , :
myApp :: Application
myApp request respond = do
response <- authRoutes db request path body
respond response