raml-0.1.0: src/Web/Raml/Types.hs
{-# LANGUAGE DeriveDataTypeable #-}
{-# LANGUAGE DeriveGeneric #-}
module Web.Raml.Types where
import Data.Text (Text)
import qualified Data.HashMap.Strict as H
type Error = String
type Uri = Text
type Path = Text
data RamlProtocol = HTTP | HTTPS
deriving (Show, Eq, Ord)
data RamlParameterType =
RamlParameterString
{ paramEnum :: Maybe [Text]
, paramPattern :: Maybe Text
, paramMaxLength :: Maybe Int
, paramMinLength :: Maybe Int
, paramExampleS :: Maybe Text
, paramDefaultS :: Maybe Text }
| RamlParameterInteger
{ paramMaximumI :: Maybe Int
, paramMinimumI :: Maybe Int
, paramExampleI :: Maybe Int
, paramDefaultI :: Maybe Int }
| RamlParameterNumber
{ paramMaximumN :: Maybe Double
, paramMinimumN :: Maybe Double
, paramExampleN :: Maybe Double
, paramDefaultN :: Maybe Double }
| RamlParameterDate
-- TODO: Implement using date type
{ paramExampleD :: Maybe Text
, paramDefaultD :: Maybe Text }
| RamlParameterBoolean
{ paramExampleB :: Maybe Bool
, paramDefaultB :: Maybe Bool }
| RamlParameterFile
-- TODO: Do example and default make sense for files?
-- Ask RAML org?
{ paramExample :: Maybe Text
, paramDefault :: Maybe Text
} deriving (Show, Eq)
data RamlParameter = RamlParameter
{ paramDisplayName :: Maybe Text
, paramDescription :: Maybe Text
, paramRepeat :: Maybe Bool
, paramRequired :: Maybe Bool
, paramType :: RamlParameterType
} deriving (Show, Eq)
data RamlTrait = RamlTrait
deriving (Show, Eq)
data RamlSecurityScheme = RamlSecurityScheme
deriving (Show, Eq)
data RamlBody = RamlBody
{ bodySchema :: Maybe Text
, bodyExample :: Maybe Text
, bodyFormParameters :: Maybe (H.HashMap Text RamlParameter)
} deriving (Show, Eq)
data RamlResponse = RamlResponse
{ respBody :: Maybe (H.HashMap Text RamlBody)
, respDescription :: Maybe Text
, respHeaders :: Maybe (H.HashMap Text RamlParameter)
} deriving (Show, Eq)
data RamlMethod = RamlMethod
{ methDescription :: Maybe Text
, methHeaders :: Maybe (H.HashMap Text RamlParameter)
, methProtocols :: Maybe [RamlProtocol]
, methQueryParameters :: Maybe (H.HashMap Text RamlParameter)
, methBody :: Maybe (H.HashMap Text RamlBody)
, methResponses :: Maybe (H.HashMap Text RamlResponse)
, methIs :: Maybe [RamlTrait]
--, methSecuredBy :: Maybe [RamlSecurityScheme]
} deriving (Show, Eq)
data RamlResource = RamlResource
{ resDisplayName :: Maybe Text
, resDescription :: Maybe Text
, resUriParameters :: Maybe (H.HashMap Text RamlParameter)
, resBaseUriParameters :: Maybe (H.HashMap Text RamlParameter)
-- TODO: Generalize or support all HTTP std. methods?
, resPost :: Maybe RamlMethod
, resGet :: Maybe RamlMethod
, resPut :: Maybe RamlMethod
, resDelete :: Maybe RamlMethod
, resResources :: H.HashMap Path RamlResource
, resIs :: Maybe [RamlTrait]
} deriving (Show, Eq)
data RamlDocumentation = RamlDocumentation
{ docTitle :: Text
, docContent :: Text
} deriving (Show, Eq, Ord)
data Raml = Raml
{ ramlTitle :: Text
, ramlVersion :: Maybe Text
-- TODO: Type for parameterized paths?
, ramlBaseUri :: Maybe Uri
-- TODO: Type for parameterized paths?
, baseUriParameters :: Maybe (H.HashMap Text RamlParameter)
-- TODO: Remember to parse from baseUri if present
, ramlProtocols :: Maybe [RamlProtocol]
-- TODO: Check against valid types in spec, better type than plain Text?
, ramlMediaType :: Maybe Text
, ramlDocumentation :: Maybe [RamlDocumentation]
, ramlResources :: H.HashMap Path RamlResource
--, ramlSchemas :: Maybe (H.HashMap Text Text)
--, ramlResourceTypes :: Maybe [RamlResourceType]
--, ramlTraits :: Maybe (H.HashMap Text RamlTrait)
--, ramlSecuritySchemes :: Maybe (H.HashMap Text RamlSecurityScheme)
} deriving (Show, Eq)