git.iko.soy/typeable/openapi3
on 178e41b help sign in
72 lines 2.1 kB history raw
1{-# LANGUAGE DeriveGeneric #-}
2{-# LANGUAGE DeriveAnyClass #-}
3{-# LANGUAGE OverloadedLists #-}
4{-# LANGUAGE OverloadedStrings #-}
5module Main where
7import Control.Lens
8import Data.Aeson
9import Data.Proxy
10import Data.Text (Text)
11import GHC.Generics
13import Data.Swagger
14import Data.Swagger.Declare
15import Data.Swagger.Lens
16import Data.Swagger.Operation
18type Username = Text
20data UserSummary = UserSummary
21 { summaryUsername :: Username
22 , summaryUserid :: Int
23 } deriving (Generic, ToSchema)
25type Group = Text
27data UserDetailed = UserDetailed
28 { username :: Username
29 , userid :: Int
30 , groups :: [Group]
31 } deriving (Generic, ToSchema)
33newtype Package = Package { packageName :: Text }
34 deriving (Generic, ToSchema)
36hackageSwagger :: Swagger
37hackageSwagger = spec & definitions .~ defs
38 where
39 (defs, spec) = runDeclare declareHackageSwagger mempty
41declareHackageSwagger :: Declare (Definitions Schema) Swagger
42declareHackageSwagger = do
43 -- param schemas
44 let usernameParamSchema = toParamSchema (Proxy :: Proxy Username)
46 -- responses
47 userSummaryResponse <- declareResponse (Proxy :: Proxy UserSummary)
48 userDetailedResponse <- declareResponse (Proxy :: Proxy UserDetailed)
49 packagesResponse <- declareResponse (Proxy :: Proxy [Package])
51 return $ mempty
52 & paths .~
53 [ ("/users", mempty & get ?~ (mempty
54 & produces ?~ MimeList ["application/json"]
55 & at 200 ?~ Inline userSummaryResponse))
56 , ("/user/{username}", mempty & get ?~ (mempty
57 & produces ?~ MimeList ["application/json"]
58 & parameters .~ [ Inline $ mempty
59 & name .~ "username"
60 & required ?~ True
61 & schema .~ ParamOther (mempty
62 & in_ .~ ParamPath
63 & paramSchema .~ usernameParamSchema) ]
64 & at 200 ?~ Inline userDetailedResponse))
65 , ("/packages", mempty & get ?~ (mempty
66 & produces ?~ MimeList ["application/json"]
67 & at 200 ?~ Inline packagesResponse))
68 ]
70main :: IO ()
71main = putStrLn . read . show . encode $ hackageSwagger