module Yesod.Raml.Type where
import Data.Text (Text)
import Data.Map (Map)
import qualified Data.Map as M
import Data.Monoid
import Yesod.Routes.TH.Types (Piece)
import Data.Default
type HandlerHint = Text
type Handler = Text
type Path = Text
type Method = Text
type ResponseCode = Text
type ContentType = Text
type Auth = Text
type HeaderKey = Text
type QueryParameter = Text
type UriParameter = Text
type SchemaKey = Text
type Schema = Text
type Protocol = Text
type MediaType = Text
type ResourceTypeKey = Text
type TraitKey = Text
data RamlResponseBody =
RamlResponseBody {
res_schema :: Maybe Text
, res_example :: Maybe Text
} deriving (Show,Eq,Ord)
instance Default RamlResponseBody where
def = RamlResponseBody {
res_schema = Nothing
, res_example = Nothing
}
data RamlResponse =
RamlResponse {
res_description :: Maybe Text
, res_headers :: Map HeaderKey RamlNamedParameters
, res_body :: Map ContentType RamlResponseBody
} deriving (Show,Eq,Ord)
instance Default RamlResponse where
def = RamlResponse {
res_description = Nothing
, res_headers = M.empty
, res_body = M.empty
}
data RamlNamedParameters =
RamlNamedParameters {
h_displayName :: Maybe Text
, h_description :: Maybe Text
, h_type :: Maybe Text
, h_enum :: [Text]
, h_pattern :: Maybe Text
, h_minLength :: Maybe Int
, h_maxLength :: Maybe Int
, h_minimum :: Maybe Int
, h_maximum :: Maybe Int
, h_example :: Maybe Text
, h_repeat :: Maybe Bool
, h_required :: Maybe Bool
, h_default :: Maybe Text
} deriving (Show,Eq,Ord)
instance Default RamlNamedParameters where
def = RamlNamedParameters {
h_displayName = Nothing
, h_description = Nothing
, h_type = Nothing
, h_enum = []
, h_pattern = Nothing
, h_minLength = Nothing
, h_maxLength = Nothing
, h_minimum = Nothing
, h_maximum = Nothing
, h_example = Nothing
, h_repeat = Nothing
, h_required = Nothing
, h_default = Nothing
}
data RamlRequestBody =
RamlRequestBody {
req_formParameters :: Map QueryParameter RamlNamedParameters
, req_schema :: Maybe Schema
, req_example :: Maybe Text
} deriving (Show,Eq,Ord)
instance Default RamlRequestBody where
def = RamlRequestBody {
req_formParameters = M.empty
, req_schema = Nothing
, req_example = Nothing
}
data RamlMethod =
RamlMethod {
m_responses :: Map ResponseCode RamlResponse
, m_description :: Maybe Text
, m_headers :: Map HeaderKey RamlNamedParameters
, m_securedBy :: [Auth]
, m_protocols :: [Protocol]
, m_queryParameters :: Map QueryParameter RamlNamedParameters
, m_body :: Map MediaType RamlRequestBody
, m_is :: [TraitKey]
} deriving (Show,Eq,Ord)
instance Default RamlMethod where
def = RamlMethod {
m_responses = M.empty
, m_description = Nothing
, m_headers = M.empty
, m_securedBy = []
, m_protocols = []
, m_queryParameters = M.empty
, m_body = M.empty
, m_is = []
}
data RamlResourceType =
RamlResourceType {
rt_usage :: Maybe Text
, rt_displayName :: Maybe Text
, rt_description :: Maybe Text
, rt_methods :: Map Method RamlMethod
, rt_paths :: Map Path RamlResource
, rt_uriParameters :: Map UriParameter RamlNamedParameters
, rt_baseUriParameters :: Map UriParameter RamlNamedParameters
} deriving (Show,Eq,Ord)
instance Default RamlResourceType where
def = RamlResourceType {
rt_usage = Nothing
, rt_displayName = Nothing
, rt_description = Nothing
, rt_methods = M.empty
, rt_paths = M.empty
, rt_uriParameters = M.empty
, rt_baseUriParameters = M.empty
}
data RamlTrait =
RamlTrait {
t_usage :: Maybe Text
, t_responses :: Map ResponseCode RamlResponse
, t_description :: Maybe Text
, t_headers :: Map HeaderKey RamlNamedParameters
, t_securedBy :: [Auth]
, t_protocols :: [Protocol]
, t_queryParameters :: Map QueryParameter RamlNamedParameters
, t_body :: Map MediaType RamlRequestBody
} deriving (Show,Eq,Ord)
instance Default RamlTrait where
def = RamlTrait {
t_usage = Nothing
, t_responses = M.empty
, t_description = Nothing
, t_headers = M.empty
, t_securedBy = []
, t_protocols = []
, t_queryParameters = M.empty
, t_body = M.empty
}
data RamlResource =
RamlResource {
r_displayName :: Maybe Text
, r_description :: Maybe Text
, r_handler :: Maybe Handler
, r_methods :: Map Method RamlMethod
, r_paths :: Map Path RamlResource
, r_uriParameters :: Map UriParameter RamlNamedParameters
, r_baseUriParameters :: Map UriParameter RamlNamedParameters
, r_type :: Maybe ResourceTypeKey
, r_is :: [TraitKey]
} deriving (Show,Eq,Ord)
instance Default RamlResource where
def = RamlResource {
r_displayName = Nothing
, r_description = Nothing
, r_handler = Nothing
, r_methods = M.empty
, r_paths = M.empty
, r_uriParameters = M.empty
, r_baseUriParameters = M.empty
, r_type = Nothing
, r_is = []
}
data RamlDocumentation =
RamlDocumentation {
doc_title :: Text
, doc_content :: Text
} deriving (Show,Eq,Ord)
data RamlSecuritySchemes =
RamlSecuritySchemes {
ss_description :: Maybe Text
, ss_type :: Maybe Text
, ss_describedBy :: Maybe Text
, ss_settings :: Maybe Text
} deriving (Show,Eq,Ord)
instance Default RamlSecuritySchemes where
def = RamlSecuritySchemes {
ss_description = Nothing
, ss_type = Nothing
, ss_describedBy = Nothing
, ss_settings = Nothing
}
data Raml =
Raml {
title :: Text
, version :: Text
, baseUri :: Text
, baseUriParameters :: Map UriParameter RamlNamedParameters
, protocols :: [Protocol]
, mediaType :: Maybe MediaType
, schemas :: [Map SchemaKey Schema]
, uriParameters :: Map UriParameter RamlNamedParameters
, documentation :: [RamlDocumentation]
, paths :: Map Path RamlResource
, securitySchemes :: [Map Auth RamlSecuritySchemes]
, resourceTypes :: [Map ResourceTypeKey RamlResourceType]
, traits :: [Map TraitKey RamlTrait]
} deriving (Show,Eq,Ord)
instance Monoid RamlTrait where
mempty = RamlTrait {
t_usage = Nothing
, t_responses = M.empty
, t_description = Nothing
, t_headers = M.empty
, t_securedBy = []
, t_protocols = []
, t_queryParameters = M.empty
, t_body = M.empty
}
mappend a b = RamlTrait {
t_usage = t_usage a <> t_usage b
, t_responses = t_responses a <> t_responses b
, t_description = t_description a <> t_description b
, t_headers = t_headers a <> t_headers b
, t_securedBy = t_securedBy a <> t_securedBy b
, t_protocols = t_protocols a <> t_protocols b
, t_queryParameters = t_queryParameters a <> t_queryParameters b
, t_body = t_body a <> t_body b
}
data MethodEx =
MethodEx {
me_method :: String
, me_example :: Maybe (ContentType,Text)
} deriving (Show)
data RouteEx =
RouteEx {
re_pieces :: [Piece String]
, re_handler :: String
, re_methods :: [MethodEx]
} deriving (Show)