-- Hoogle documentation, generated by Haddock -- See Hoogle, http://www.haskell.org/hoogle/ -- | WAI based library for web api -- -- WAI based library for web api @package webapi @version 0.2.0.0 -- | Defines various types to represent the HTTP methods. module WebApi.Method -- | Type representing a GET method. data GET -- | Type representing a POST method. data POST -- | Type representing a PUT method. data PUT -- | Type representing a DELETE method. data DELETE -- | Type representing a HEAD method. data HEAD -- | Type representing a PATCH method. data PATCH -- | Type representing a TRACE method. data TRACE -- | Type representing a OPTIONS method. data OPTIONS -- | Type representing a CONNECT method. data CONNECT -- | Type representing a Custom method. data CUSTOM (m :: Symbol) -- | Singleton class for method types. class SingMethod (meth :: *) singMethod :: SingMethod meth => Proxy meth -> Method instance WebApi.Method.SingMethod WebApi.Method.GET instance WebApi.Method.SingMethod WebApi.Method.POST instance WebApi.Method.SingMethod WebApi.Method.PUT instance WebApi.Method.SingMethod WebApi.Method.DELETE instance WebApi.Method.SingMethod WebApi.Method.OPTIONS instance WebApi.Method.SingMethod WebApi.Method.HEAD instance WebApi.Method.SingMethod WebApi.Method.TRACE instance WebApi.Method.SingMethod WebApi.Method.PATCH instance WebApi.Method.SingMethod WebApi.Method.CONNECT instance GHC.TypeLits.KnownSymbol m => WebApi.Method.SingMethod (WebApi.Method.CUSTOM m) -- | Param serialization and deserialization. ToParam and -- EncodeParam are responsible for serialization part. -- EncodeParam converts the value into a wire format. -- ToParam is responsible for creating (nested) key value pairs, -- which can be then used to deserialize to original type. For example -- --
--   encodeParam 5 == "5"
--   
--   data Foo = Foo { foo :: Int }
--            deriving (Show, Eq, Generic)
--   
--   data Bar = Bar { bar :: Foo }
--            deriving (Show, Eq, Generic)
--   
--   instance ToParam Foo 'FormParam
--   instance ToParam Bar 'FormParam
--   
--   toParam (Proxy :: Proxy 'FormParam) "" (Bar (Foo 5)) == [("bar.foo","5")]
--   
-- -- Deserialization works analogously, FromParam and -- DecodeParam are counterparts to ToParam and -- EncodeParam respectively. Generic instances are provided for -- all of them. This means that the user only need to derive Generic in -- their type, and provide instance with an empty body. Note that for -- headers FromHeader and ToHeader is being used in place -- of FromParam and ToParam. Nesting is not supported for -- headers. module WebApi.Param -- | Serialize a type to a given type of kind ParamK. class ToParam a (parK :: ParamK) where toParam pt pfx = gtoParam pt pfx (ParamAcc 0 False) ParamSettings . from toParam :: ToParam a parK => Proxy (parK :: ParamK) -> ByteString -> a -> [SerializedData parK] -- | Serialize a type to ByteString. class EncodeParam (t :: *) where encodeParam = gEncodeParam . from encodeParam :: EncodeParam t => t -> ByteString -- | Serialize a type to the header params class ToHeader a where toHeader = gtoHeader "" (ParamAcc 0 False) ParamSettings . from toHeader :: ToHeader a => a -> [Header] -- | Define result of serialization of a type of kind ParamK. -- | Serialize a type into query params. toQueryParam :: (ToParam a QueryParam) => a -> Query -- | Serialize a type into form params. toFormParam :: (ToParam a FormParam) => a -> [(ByteString, ByteString)] -- | Serialize a type into file params. toFileParam :: (ToParam a FileParam) => a -> [(ByteString, FileInfo FilePath)] -- | Serialize a type into path params. toPathParam :: (ToParam a PathParam) => a -> [ByteString] -- | Serialize a type into cookie. toCookie :: (ToParam a Cookie) => a -> [(ByteString, ByteString)] -- | Serialize a type without nesting. toNonNestedParam :: (ToParam (NonNested a) parK, EncodeParam a) => Proxy (parK :: ParamK) -> ByteString -> a -> [SerializedData parK] -- | (Try to) Deserialize a type from a given type of kind ParamK. class FromParam a (parK :: ParamK) where fromParam pt pfx = (fmap to) . gfromParam pt pfx (ParamAcc 0 False) ParamSettings fromParam :: FromParam a parK => Proxy (parK :: ParamK) -> ByteString -> Trie (DeSerializedData parK) -> Validation [ParamErr] a -- | (Try to) Deserialize a type from ByteString. class DecodeParam (t :: *) where decodeParam = (fmap to) . gDecodeParam decodeParam :: DecodeParam t => ByteString -> Maybe t -- | (Try to) Deserialize a type from the header params class FromHeader a where fromHeader = (fmap to) . gfromHeader "" (ParamAcc 0 False) ParamSettings fromHeader :: FromHeader a => [Header] -> Validation [ParamErr] a -- | Datatype representing the parsed result of params. newtype Validation e a Validation :: Either e a -> Validation e a [getValidation] :: Validation e a -> Either e a -- | Errors that occured during deserialization. data ParamErr -- | The key was not found. NotFound :: ByteString -> ParamErr -- | A parse error occured while deserializing the type. ParseErr :: ByteString -> Text -> ParamErr -- | Convert the ParamErr that occured during deserialization into -- ApiErr type which can then be put in Response. class ParamErrToApiErr apiErr toApiErr :: ParamErrToApiErr apiErr => [ParamErr] -> apiErr -- | Define result of deserialization of a type of kind ParamK. -- | (Try to) Deserialize a type from query params. fromQueryParam :: (FromParam a QueryParam) => Query -> Validation [ParamErr] a -- | (Try to) Deserialize a type from form params. fromFormParam :: (FromParam a FormParam) => [(ByteString, ByteString)] -> Validation [ParamErr] a -- | (Try to) Deserialize a type from file params. fromFileParam :: (FromParam a FileParam) => [(ByteString, FileInfo FilePath)] -> Validation [ParamErr] a -- | (Try to) Deserialize a type from cookie. fromCookie :: (FromParam a Cookie) => [(ByteString, ByteString)] -> Validation [ParamErr] a -- | Lookup a value from the Trie using the given key. lookupParam :: Proxy (parK :: ParamK) -> ByteString -> Trie (DeSerializedData parK) -> Maybe (DeSerializedData parK) -- | (Try to) Deserialize a type without nesting. fromNonNestedParam :: (FromParam (NonNested a) parK, DecodeParam a) => Proxy (parK :: ParamK) -> ByteString -> Trie (DeSerializedData parK) -> Validation [ParamErr] a -- | Serializing JsonOf will produce a JSON representation of the -- value contained within. This is useful if params has to be sent as -- JSON. newtype JsonOf a JsonOf :: a -> JsonOf a [getValue] :: JsonOf a -> a -- | Use this type if a key is required but the value is optional. newtype OptValue a OptValue :: Maybe a -> OptValue a [toMaybe] :: OptValue a -> Maybe a -- | A type for holding a file. newtype FileInfo FileInfo :: FileInfo FilePath -> FileInfo [fileInfo] :: FileInfo -> FileInfo FilePath -- | Use this type if for serialization / deserialization nesting is not -- required. The type contained within most likely requires -- EncodeParam / DecodeParam. newtype NonNested a NonNested :: a -> NonNested a [getNonNestedParam] :: NonNested a -> a -- | (Kind) Describes the various types of Param. data ParamK QueryParam :: ParamK FormParam :: ParamK FileParam :: ParamK PathParam :: ParamK Cookie :: ParamK -- | Obtain the file path from FileInfo. filePath :: FileInfo -> FilePath -- | Nest the key with a prefix. -- --
--   nest "pfx" "key" == "pfx.key"
--   nest "" "key" == "key"
--   
nest :: ByteString -> ByteString -> ByteString instance GHC.Classes.Eq WebApi.Param.ParamSettings instance GHC.Show.Show WebApi.Param.ParamSettings instance GHC.Classes.Eq WebApi.Param.ParamAcc instance GHC.Show.Show WebApi.Param.ParamAcc instance GHC.Classes.Eq WebApi.Param.ParamErr instance GHC.Show.Show WebApi.Param.ParamErr instance GHC.Read.Read a => GHC.Read.Read (WebApi.Param.NonNested a) instance GHC.Classes.Eq a => GHC.Classes.Eq (WebApi.Param.NonNested a) instance GHC.Show.Show a => GHC.Show.Show (WebApi.Param.NonNested a) instance (GHC.Show.Show e, GHC.Show.Show a) => GHC.Show.Show (WebApi.Param.Validation e a) instance GHC.Base.Functor (WebApi.Param.Validation e) instance (GHC.Classes.Eq e, GHC.Classes.Eq a) => GHC.Classes.Eq (WebApi.Param.Validation e a) instance GHC.Classes.Eq WebApi.Param.Unit instance GHC.Show.Show WebApi.Param.Unit instance GHC.Classes.Ord a => GHC.Classes.Ord (WebApi.Param.JsonOf a) instance GHC.Classes.Eq a => GHC.Classes.Eq (WebApi.Param.JsonOf a) instance GHC.Read.Read a => GHC.Read.Read (WebApi.Param.JsonOf a) instance GHC.Show.Show a => GHC.Show.Show (WebApi.Param.JsonOf a) instance GHC.Classes.Ord a => GHC.Classes.Ord (WebApi.Param.OptValue a) instance GHC.Classes.Eq a => GHC.Classes.Eq (WebApi.Param.OptValue a) instance GHC.Read.Read a => GHC.Read.Read (WebApi.Param.OptValue a) instance GHC.Show.Show a => GHC.Show.Show (WebApi.Param.OptValue a) instance GHC.Show.Show WebApi.Param.FileInfo instance GHC.Classes.Eq WebApi.Param.FileInfo instance Data.Aeson.Types.Class.ToJSON a => Data.Aeson.Types.Class.ToJSON (WebApi.Param.JsonOf a) instance Data.Aeson.Types.Class.FromJSON a => Data.Aeson.Types.Class.FromJSON (WebApi.Param.JsonOf a) instance GHC.Base.Monoid e => GHC.Base.Applicative (WebApi.Param.Validation e) instance WebApi.Param.EncodeParam Data.ByteString.Internal.ByteString instance WebApi.Param.DecodeParam Data.ByteString.Internal.ByteString instance WebApi.Param.EncodeParam GHC.Types.Int instance WebApi.Param.DecodeParam GHC.Types.Int instance WebApi.Param.EncodeParam GHC.Int.Int8 instance WebApi.Param.DecodeParam GHC.Int.Int8 instance WebApi.Param.EncodeParam GHC.Int.Int16 instance WebApi.Param.DecodeParam GHC.Int.Int16 instance WebApi.Param.EncodeParam GHC.Int.Int32 instance WebApi.Param.DecodeParam GHC.Int.Int32 instance WebApi.Param.EncodeParam GHC.Int.Int64 instance WebApi.Param.DecodeParam GHC.Int.Int64 instance WebApi.Param.EncodeParam GHC.Types.Word instance WebApi.Param.DecodeParam GHC.Types.Word instance WebApi.Param.EncodeParam GHC.Word.Word8 instance WebApi.Param.DecodeParam GHC.Word.Word8 instance WebApi.Param.EncodeParam GHC.Word.Word16 instance WebApi.Param.DecodeParam GHC.Word.Word16 instance WebApi.Param.EncodeParam GHC.Word.Word32 instance WebApi.Param.DecodeParam GHC.Word.Word32 instance WebApi.Param.EncodeParam GHC.Word.Word64 instance WebApi.Param.DecodeParam GHC.Word.Word64 instance WebApi.Param.EncodeParam GHC.Types.Float instance WebApi.Param.DecodeParam GHC.Types.Float instance WebApi.Param.EncodeParam GHC.Types.Double instance WebApi.Param.DecodeParam GHC.Types.Double instance WebApi.Param.EncodeParam GHC.Types.Char instance WebApi.Param.DecodeParam GHC.Types.Char instance WebApi.Param.EncodeParam Data.Text.Internal.Text instance WebApi.Param.DecodeParam Data.Text.Internal.Text instance WebApi.Param.EncodeParam Data.Time.Calendar.Days.Day instance WebApi.Param.DecodeParam Data.Time.Calendar.Days.Day instance WebApi.Param.EncodeParam Data.Time.Clock.UTC.UTCTime instance WebApi.Param.DecodeParam Data.Time.Clock.UTC.UTCTime instance WebApi.Param.EncodeParam WebApi.Param.Unit instance WebApi.Param.DecodeParam WebApi.Param.Unit instance (WebApi.Param.EncodeParam a, WebApi.Param.EncodeParam b) => WebApi.Param.EncodeParam (a, b) instance (WebApi.Param.DecodeParam a, WebApi.Param.DecodeParam b) => WebApi.Param.DecodeParam (a, b) instance WebApi.Param.EncodeParam GHC.Types.Bool instance WebApi.Param.DecodeParam GHC.Types.Bool instance WebApi.Param.EncodeParam GHC.Integer.Type.Integer instance WebApi.Param.DecodeParam GHC.Integer.Type.Integer instance Data.Aeson.Types.Class.ToJSON a => WebApi.Param.EncodeParam (WebApi.Param.JsonOf a) instance Data.Aeson.Types.Class.FromJSON a => WebApi.Param.DecodeParam (WebApi.Param.JsonOf a) instance WebApi.Param.GHttpParam f => WebApi.Param.GHttpParam (GHC.Generics.D1 c f) instance (WebApi.Param.GHttpParam f, WebApi.Param.GHttpParam g) => WebApi.Param.GHttpParam (f GHC.Generics.:+: g) instance (WebApi.Param.GHttpParam f, GHC.Generics.Constructor c) => WebApi.Param.GHttpParam (GHC.Generics.C1 c f) instance WebApi.Param.GHttpParam GHC.Generics.U1 instance WebApi.Param.EncodeParam a => WebApi.Param.ToParam (WebApi.Param.NonNested a) 'WebApi.Param.QueryParam instance WebApi.Param.EncodeParam a => WebApi.Param.ToParam (WebApi.Param.NonNested a) 'WebApi.Param.FormParam instance WebApi.Param.EncodeParam a => WebApi.Param.ToParam (WebApi.Param.NonNested a) 'WebApi.Param.Cookie instance (WebApi.Param.DecodeParam a, Data.Typeable.Internal.Typeable a) => WebApi.Param.FromParam (WebApi.Param.NonNested a) 'WebApi.Param.QueryParam instance (WebApi.Param.DecodeParam a, Data.Typeable.Internal.Typeable a) => WebApi.Param.FromParam (WebApi.Param.NonNested a) 'WebApi.Param.FormParam instance (WebApi.Param.DecodeParam a, Data.Typeable.Internal.Typeable a) => WebApi.Param.FromParam (WebApi.Param.NonNested a) 'WebApi.Param.Cookie instance WebApi.Param.ToParam () parK instance WebApi.Param.ToHeader () instance WebApi.Param.ToParam WebApi.Param.Unit 'WebApi.Param.QueryParam instance WebApi.Param.ToParam WebApi.Param.Unit 'WebApi.Param.FormParam instance WebApi.Param.ToParam WebApi.Param.Unit 'WebApi.Param.Cookie instance WebApi.Param.ToParam GHC.Types.Int 'WebApi.Param.QueryParam instance WebApi.Param.ToParam GHC.Types.Int 'WebApi.Param.FormParam instance WebApi.Param.ToParam GHC.Types.Int 'WebApi.Param.Cookie instance WebApi.Param.ToParam GHC.Int.Int8 'WebApi.Param.QueryParam instance WebApi.Param.ToParam GHC.Int.Int8 'WebApi.Param.FormParam instance WebApi.Param.ToParam GHC.Int.Int8 'WebApi.Param.Cookie instance WebApi.Param.ToParam GHC.Int.Int16 'WebApi.Param.QueryParam instance WebApi.Param.ToParam GHC.Int.Int16 'WebApi.Param.FormParam instance WebApi.Param.ToParam GHC.Int.Int16 'WebApi.Param.Cookie instance WebApi.Param.ToParam GHC.Int.Int32 'WebApi.Param.QueryParam instance WebApi.Param.ToParam GHC.Int.Int32 'WebApi.Param.FormParam instance WebApi.Param.ToParam GHC.Int.Int32 'WebApi.Param.Cookie instance WebApi.Param.ToParam GHC.Int.Int64 'WebApi.Param.QueryParam instance WebApi.Param.ToParam GHC.Int.Int64 'WebApi.Param.FormParam instance WebApi.Param.ToParam GHC.Int.Int64 'WebApi.Param.Cookie instance WebApi.Param.ToParam GHC.Types.Word 'WebApi.Param.QueryParam instance WebApi.Param.ToParam GHC.Types.Word 'WebApi.Param.FormParam instance WebApi.Param.ToParam GHC.Types.Word 'WebApi.Param.Cookie instance WebApi.Param.ToParam GHC.Word.Word8 'WebApi.Param.QueryParam instance WebApi.Param.ToParam GHC.Word.Word8 'WebApi.Param.FormParam instance WebApi.Param.ToParam GHC.Word.Word8 'WebApi.Param.Cookie instance WebApi.Param.ToParam GHC.Word.Word16 'WebApi.Param.QueryParam instance WebApi.Param.ToParam GHC.Word.Word16 'WebApi.Param.FormParam instance WebApi.Param.ToParam GHC.Word.Word16 'WebApi.Param.Cookie instance WebApi.Param.ToParam GHC.Word.Word32 'WebApi.Param.QueryParam instance WebApi.Param.ToParam GHC.Word.Word32 'WebApi.Param.FormParam instance WebApi.Param.ToParam GHC.Word.Word32 'WebApi.Param.Cookie instance WebApi.Param.ToParam GHC.Word.Word64 'WebApi.Param.QueryParam instance WebApi.Param.ToParam GHC.Word.Word64 'WebApi.Param.FormParam instance WebApi.Param.ToParam GHC.Word.Word64 'WebApi.Param.Cookie instance WebApi.Param.ToParam GHC.Integer.Type.Integer 'WebApi.Param.QueryParam instance WebApi.Param.ToParam GHC.Integer.Type.Integer 'WebApi.Param.FormParam instance WebApi.Param.ToParam GHC.Integer.Type.Integer 'WebApi.Param.Cookie instance WebApi.Param.ToParam GHC.Types.Bool 'WebApi.Param.QueryParam instance WebApi.Param.ToParam GHC.Types.Bool 'WebApi.Param.FormParam instance WebApi.Param.ToParam GHC.Types.Bool 'WebApi.Param.Cookie instance WebApi.Param.ToParam GHC.Types.Double 'WebApi.Param.QueryParam instance WebApi.Param.ToParam GHC.Types.Double 'WebApi.Param.FormParam instance WebApi.Param.ToParam GHC.Types.Double 'WebApi.Param.Cookie instance WebApi.Param.ToParam GHC.Types.Float 'WebApi.Param.QueryParam instance WebApi.Param.ToParam GHC.Types.Float 'WebApi.Param.FormParam instance WebApi.Param.ToParam GHC.Types.Float 'WebApi.Param.Cookie instance WebApi.Param.ToParam GHC.Types.Char 'WebApi.Param.QueryParam instance WebApi.Param.ToParam GHC.Types.Char 'WebApi.Param.FormParam instance WebApi.Param.ToParam GHC.Types.Char 'WebApi.Param.Cookie instance WebApi.Param.ToParam Data.Text.Internal.Text 'WebApi.Param.QueryParam instance WebApi.Param.ToParam Data.Text.Internal.Text 'WebApi.Param.FormParam instance WebApi.Param.ToParam Data.Text.Internal.Text 'WebApi.Param.Cookie instance WebApi.Param.ToParam Data.ByteString.Internal.ByteString 'WebApi.Param.QueryParam instance WebApi.Param.ToParam Data.ByteString.Internal.ByteString 'WebApi.Param.FormParam instance WebApi.Param.ToParam Data.ByteString.Internal.ByteString 'WebApi.Param.Cookie instance WebApi.Param.ToParam Data.Time.Calendar.Days.Day 'WebApi.Param.QueryParam instance WebApi.Param.ToParam Data.Time.Calendar.Days.Day 'WebApi.Param.FormParam instance WebApi.Param.ToParam Data.Time.Calendar.Days.Day 'WebApi.Param.Cookie instance WebApi.Param.ToParam Data.Time.Clock.UTC.UTCTime 'WebApi.Param.QueryParam instance WebApi.Param.ToParam Data.Time.Clock.UTC.UTCTime 'WebApi.Param.FormParam instance WebApi.Param.ToParam Data.Time.Clock.UTC.UTCTime 'WebApi.Param.Cookie instance WebApi.Param.EncodeParam a => WebApi.Param.ToParam (WebApi.Param.OptValue a) 'WebApi.Param.QueryParam instance WebApi.Param.EncodeParam a => WebApi.Param.ToParam (WebApi.Param.OptValue a) 'WebApi.Param.FormParam instance WebApi.Param.EncodeParam a => WebApi.Param.ToParam (WebApi.Param.OptValue a) 'WebApi.Param.Cookie instance (Data.Aeson.Types.Class.ToJSON a, Data.Aeson.Types.Class.FromJSON a) => WebApi.Param.ToParam (WebApi.Param.JsonOf a) 'WebApi.Param.QueryParam instance (Data.Aeson.Types.Class.ToJSON a, Data.Aeson.Types.Class.FromJSON a) => WebApi.Param.ToParam (WebApi.Param.JsonOf a) 'WebApi.Param.FormParam instance (Data.Aeson.Types.Class.ToJSON a, Data.Aeson.Types.Class.FromJSON a) => WebApi.Param.ToParam (WebApi.Param.JsonOf a) 'WebApi.Param.Cookie instance WebApi.Param.ToParam a par => WebApi.Param.ToParam (GHC.Base.Maybe a) par instance (WebApi.Param.ToParam a par, WebApi.Param.ToParam b par) => WebApi.Param.ToParam (Data.Either.Either a b) par instance WebApi.Param.ToParam a par => WebApi.Param.ToParam [a] par instance WebApi.Param.ToParam a par => WebApi.Param.ToParam (Data.Vector.Vector a) par instance WebApi.Param.FromParam () parK instance WebApi.Param.FromHeader () instance WebApi.Param.FromParam WebApi.Param.Unit 'WebApi.Param.QueryParam instance WebApi.Param.FromParam WebApi.Param.Unit 'WebApi.Param.FormParam instance WebApi.Param.FromParam WebApi.Param.Unit 'WebApi.Param.Cookie instance WebApi.Param.FromParam GHC.Types.Bool 'WebApi.Param.QueryParam instance WebApi.Param.FromParam GHC.Types.Bool 'WebApi.Param.FormParam instance WebApi.Param.FromParam GHC.Types.Bool 'WebApi.Param.Cookie instance WebApi.Param.FromParam GHC.Types.Char 'WebApi.Param.QueryParam instance WebApi.Param.FromParam GHC.Types.Char 'WebApi.Param.FormParam instance WebApi.Param.FromParam GHC.Types.Char 'WebApi.Param.Cookie instance WebApi.Param.FromParam Data.Time.Clock.UTC.UTCTime 'WebApi.Param.QueryParam instance WebApi.Param.FromParam Data.Time.Clock.UTC.UTCTime 'WebApi.Param.FormParam instance WebApi.Param.FromParam Data.Time.Clock.UTC.UTCTime 'WebApi.Param.Cookie instance WebApi.Param.FromParam GHC.Types.Int 'WebApi.Param.QueryParam instance WebApi.Param.FromParam GHC.Types.Int 'WebApi.Param.FormParam instance WebApi.Param.FromParam GHC.Types.Int 'WebApi.Param.Cookie instance WebApi.Param.FromParam GHC.Int.Int8 'WebApi.Param.QueryParam instance WebApi.Param.FromParam GHC.Int.Int8 'WebApi.Param.FormParam instance WebApi.Param.FromParam GHC.Int.Int8 'WebApi.Param.Cookie instance WebApi.Param.FromParam GHC.Int.Int16 'WebApi.Param.QueryParam instance WebApi.Param.FromParam GHC.Int.Int16 'WebApi.Param.FormParam instance WebApi.Param.FromParam GHC.Int.Int16 'WebApi.Param.Cookie instance WebApi.Param.FromParam GHC.Int.Int32 'WebApi.Param.QueryParam instance WebApi.Param.FromParam GHC.Int.Int32 'WebApi.Param.FormParam instance WebApi.Param.FromParam GHC.Int.Int32 'WebApi.Param.Cookie instance WebApi.Param.FromParam GHC.Int.Int64 'WebApi.Param.QueryParam instance WebApi.Param.FromParam GHC.Int.Int64 'WebApi.Param.FormParam instance WebApi.Param.FromParam GHC.Int.Int64 'WebApi.Param.Cookie instance WebApi.Param.FromParam GHC.Integer.Type.Integer 'WebApi.Param.QueryParam instance WebApi.Param.FromParam GHC.Integer.Type.Integer 'WebApi.Param.FormParam instance WebApi.Param.FromParam GHC.Integer.Type.Integer 'WebApi.Param.Cookie instance WebApi.Param.FromParam GHC.Types.Word 'WebApi.Param.QueryParam instance WebApi.Param.FromParam GHC.Types.Word 'WebApi.Param.FormParam instance WebApi.Param.FromParam GHC.Types.Word 'WebApi.Param.Cookie instance WebApi.Param.FromParam GHC.Word.Word8 'WebApi.Param.QueryParam instance WebApi.Param.FromParam GHC.Word.Word8 'WebApi.Param.FormParam instance WebApi.Param.FromParam GHC.Word.Word8 'WebApi.Param.Cookie instance WebApi.Param.FromParam GHC.Word.Word16 'WebApi.Param.QueryParam instance WebApi.Param.FromParam GHC.Word.Word16 'WebApi.Param.FormParam instance WebApi.Param.FromParam GHC.Word.Word16 'WebApi.Param.Cookie instance WebApi.Param.FromParam GHC.Word.Word32 'WebApi.Param.QueryParam instance WebApi.Param.FromParam GHC.Word.Word32 'WebApi.Param.FormParam instance WebApi.Param.FromParam GHC.Word.Word32 'WebApi.Param.Cookie instance WebApi.Param.FromParam GHC.Word.Word64 'WebApi.Param.QueryParam instance WebApi.Param.FromParam GHC.Word.Word64 'WebApi.Param.FormParam instance WebApi.Param.FromParam GHC.Word.Word64 'WebApi.Param.Cookie instance WebApi.Param.FromParam GHC.Types.Double 'WebApi.Param.QueryParam instance WebApi.Param.FromParam GHC.Types.Double 'WebApi.Param.FormParam instance WebApi.Param.FromParam GHC.Types.Double 'WebApi.Param.Cookie instance WebApi.Param.FromParam GHC.Types.Float 'WebApi.Param.QueryParam instance WebApi.Param.FromParam GHC.Types.Float 'WebApi.Param.FormParam instance WebApi.Param.FromParam GHC.Types.Float 'WebApi.Param.Cookie instance WebApi.Param.FromParam Data.ByteString.Internal.ByteString 'WebApi.Param.QueryParam instance WebApi.Param.FromParam Data.ByteString.Internal.ByteString 'WebApi.Param.FormParam instance WebApi.Param.FromParam Data.ByteString.Internal.ByteString 'WebApi.Param.Cookie instance WebApi.Param.FromParam a par => WebApi.Param.FromParam (GHC.Base.Maybe a) par instance (WebApi.Param.FromParam a par, WebApi.Param.FromParam b par) => WebApi.Param.FromParam (Data.Either.Either a b) par instance WebApi.Param.FromParam Data.Text.Internal.Text 'WebApi.Param.QueryParam instance WebApi.Param.FromParam Data.Text.Internal.Text 'WebApi.Param.FormParam instance WebApi.Param.FromParam Data.Text.Internal.Text 'WebApi.Param.Cookie instance WebApi.Param.FromParam Data.Time.Calendar.Days.Day 'WebApi.Param.QueryParam instance WebApi.Param.FromParam Data.Time.Calendar.Days.Day 'WebApi.Param.FormParam instance WebApi.Param.FromParam Data.Time.Calendar.Days.Day 'WebApi.Param.Cookie instance (GHC.Show.Show (WebApi.Param.DeSerializedData par), WebApi.Param.FromParam a par) => WebApi.Param.FromParam [a] par instance (GHC.Show.Show (WebApi.Param.DeSerializedData par), WebApi.Param.FromParam a par) => WebApi.Param.FromParam (Data.Vector.Vector a) par instance WebApi.Param.DecodeParam a => WebApi.Param.FromParam (WebApi.Param.OptValue a) 'WebApi.Param.QueryParam instance WebApi.Param.DecodeParam a => WebApi.Param.FromParam (WebApi.Param.OptValue a) 'WebApi.Param.FormParam instance WebApi.Param.DecodeParam a => WebApi.Param.FromParam (WebApi.Param.OptValue a) 'WebApi.Param.Cookie instance WebApi.Param.ToParam WebApi.Param.FileInfo 'WebApi.Param.FileParam instance WebApi.Param.FromParam WebApi.Param.FileInfo 'WebApi.Param.FileParam instance WebApi.Param.ToParam Data.ByteString.Internal.ByteString 'WebApi.Param.PathParam instance WebApi.Param.ToParam GHC.Types.Int 'WebApi.Param.PathParam instance WebApi.Param.ToParam GHC.Int.Int8 'WebApi.Param.PathParam instance WebApi.Param.ToParam GHC.Int.Int16 'WebApi.Param.PathParam instance WebApi.Param.ToParam GHC.Int.Int32 'WebApi.Param.PathParam instance WebApi.Param.ToParam GHC.Int.Int64 'WebApi.Param.PathParam instance WebApi.Param.ToParam GHC.Types.Word 'WebApi.Param.PathParam instance WebApi.Param.ToParam GHC.Word.Word8 'WebApi.Param.PathParam instance WebApi.Param.ToParam GHC.Word.Word16 'WebApi.Param.PathParam instance WebApi.Param.ToParam GHC.Word.Word32 'WebApi.Param.PathParam instance WebApi.Param.ToParam GHC.Word.Word64 'WebApi.Param.PathParam instance WebApi.Param.ToParam GHC.Types.Float 'WebApi.Param.PathParam instance WebApi.Param.ToParam GHC.Types.Double 'WebApi.Param.PathParam instance WebApi.Param.ToParam GHC.Types.Char 'WebApi.Param.PathParam instance WebApi.Param.ToParam Data.Text.Internal.Text 'WebApi.Param.PathParam instance WebApi.Param.ToParam Data.Time.Calendar.Days.Day 'WebApi.Param.PathParam instance WebApi.Param.ToParam Data.Time.Clock.UTC.UTCTime 'WebApi.Param.PathParam instance WebApi.Param.ToParam GHC.Types.Bool 'WebApi.Param.PathParam instance WebApi.Param.ToParam GHC.Integer.Type.Integer 'WebApi.Param.PathParam instance Data.Aeson.Types.Class.ToJSON a => WebApi.Param.ToParam (WebApi.Param.JsonOf a) 'WebApi.Param.PathParam instance (WebApi.Param.EncodeParam a, WebApi.Param.EncodeParam b) => WebApi.Param.ToParam (a, b) 'WebApi.Param.PathParam instance (WebApi.Param.EncodeParam a, WebApi.Param.EncodeParam b, WebApi.Param.EncodeParam c) => WebApi.Param.ToParam (a, b, c) 'WebApi.Param.PathParam instance (WebApi.Param.EncodeParam a, WebApi.Param.EncodeParam b, WebApi.Param.EncodeParam c, WebApi.Param.EncodeParam d) => WebApi.Param.ToParam (a, b, c, d) 'WebApi.Param.PathParam instance (WebApi.Param.EncodeParam a, WebApi.Param.EncodeParam b, WebApi.Param.EncodeParam c, WebApi.Param.EncodeParam d, WebApi.Param.EncodeParam e) => WebApi.Param.ToParam (a, b, c, d, e) 'WebApi.Param.PathParam instance (WebApi.Param.EncodeParam a, WebApi.Param.EncodeParam b, WebApi.Param.EncodeParam c, WebApi.Param.EncodeParam d, WebApi.Param.EncodeParam e, WebApi.Param.EncodeParam f) => WebApi.Param.ToParam (a, b, c, d, e, f) 'WebApi.Param.PathParam instance (WebApi.Param.EncodeParam a, WebApi.Param.EncodeParam b, WebApi.Param.EncodeParam c, WebApi.Param.EncodeParam d, WebApi.Param.EncodeParam e, WebApi.Param.EncodeParam f, WebApi.Param.EncodeParam g, WebApi.Param.EncodeParam h) => WebApi.Param.ToParam (a, b, c, d, e, f, g, h) 'WebApi.Param.PathParam instance (WebApi.Param.EncodeParam a, WebApi.Param.EncodeParam b, WebApi.Param.EncodeParam c, WebApi.Param.EncodeParam d, WebApi.Param.EncodeParam e, WebApi.Param.EncodeParam f, WebApi.Param.EncodeParam g, WebApi.Param.EncodeParam h, WebApi.Param.EncodeParam i) => WebApi.Param.ToParam (a, b, c, d, e, f, g, h, i) 'WebApi.Param.PathParam instance (WebApi.Param.EncodeParam a, WebApi.Param.EncodeParam b, WebApi.Param.EncodeParam c, WebApi.Param.EncodeParam d, WebApi.Param.EncodeParam e, WebApi.Param.EncodeParam f, WebApi.Param.EncodeParam g, WebApi.Param.EncodeParam h, WebApi.Param.EncodeParam i, WebApi.Param.EncodeParam j) => WebApi.Param.ToParam (a, b, c, d, e, f, g, h, i, j) 'WebApi.Param.PathParam instance Data.Aeson.Types.Class.ToJSON WebApi.Param.ParamErr instance WebApi.Param.ParamErrToApiErr () instance WebApi.Param.ParamErrToApiErr Data.Text.Internal.Text instance WebApi.Param.ParamErrToApiErr Data.Aeson.Types.Internal.Value instance (WebApi.Param.GToHeader f, WebApi.Param.GToHeader g) => WebApi.Param.GToHeader (f GHC.Generics.:+: g) instance (WebApi.Param.GToHeader f, WebApi.Param.GToHeader g) => WebApi.Param.GToHeader (f GHC.Generics.:*: g) instance WebApi.Param.EncodeParam c => WebApi.Param.GToHeader (GHC.Generics.K1 i c) instance (WebApi.Param.GToHeader f, GHC.Generics.Constructor t) => WebApi.Param.GToHeader (GHC.Generics.M1 GHC.Generics.C t f) instance WebApi.Param.GToHeader f => WebApi.Param.GToHeader (GHC.Generics.M1 GHC.Generics.D t f) instance (WebApi.Param.GToHeader f, GHC.Generics.Selector t) => WebApi.Param.GToHeader (GHC.Generics.M1 GHC.Generics.S t f) instance WebApi.Param.GToHeader GHC.Generics.U1 instance (WebApi.Param.GFromHeader f, WebApi.Param.GFromHeader g) => WebApi.Param.GFromHeader (f GHC.Generics.:*: g) instance (WebApi.Param.GFromHeader f, WebApi.Param.GFromHeader g) => WebApi.Param.GFromHeader (f GHC.Generics.:+: g) instance (WebApi.Param.GFromHeader f, GHC.Generics.Constructor t) => WebApi.Param.GFromHeader (GHC.Generics.M1 GHC.Generics.C t f) instance (WebApi.Param.GFromHeader f, GHC.Generics.Datatype t) => WebApi.Param.GFromHeader (GHC.Generics.M1 GHC.Generics.D t f) instance (WebApi.Param.GFromHeader f, GHC.Generics.Selector t) => WebApi.Param.GFromHeader (GHC.Generics.M1 GHC.Generics.S t f) instance WebApi.Param.DecodeParam c => WebApi.Param.GFromHeader (GHC.Generics.K1 i c) instance WebApi.Param.GFromHeader GHC.Generics.U1 instance (WebApi.Param.GFromParam f parK, WebApi.Param.GFromParam g parK) => WebApi.Param.GFromParam (f GHC.Generics.:*: g) parK instance (WebApi.Param.GFromParam f parK, WebApi.Param.GFromParam g parK) => WebApi.Param.GFromParam (f GHC.Generics.:+: g) parK instance (WebApi.Param.GFromParam f parK, GHC.Generics.Constructor t) => WebApi.Param.GFromParam (GHC.Generics.M1 GHC.Generics.C t f) parK instance (WebApi.Param.GFromParam f parK, GHC.Generics.Datatype t) => WebApi.Param.GFromParam (GHC.Generics.M1 GHC.Generics.D t f) parK instance (WebApi.Param.GFromParam f parK, GHC.Generics.Selector t) => WebApi.Param.GFromParam (GHC.Generics.M1 GHC.Generics.S t f) parK instance WebApi.Param.FromParam c parK => WebApi.Param.GFromParam (GHC.Generics.K1 i c) parK instance WebApi.Param.FromParam WebApi.Param.Unit parK => WebApi.Param.GFromParam GHC.Generics.U1 parK instance (WebApi.Param.GToParam f parK, WebApi.Param.GToParam g parK) => WebApi.Param.GToParam (f GHC.Generics.:*: g) parK instance (WebApi.Param.GToParam f parK, WebApi.Param.GToParam g parK) => WebApi.Param.GToParam (f GHC.Generics.:+: g) parK instance WebApi.Param.ToParam c parK => WebApi.Param.GToParam (GHC.Generics.K1 i c) parK instance (WebApi.Param.GToParam f parK, GHC.Generics.Constructor t) => WebApi.Param.GToParam (GHC.Generics.M1 GHC.Generics.C t f) parK instance WebApi.Param.GToParam f parK => WebApi.Param.GToParam (GHC.Generics.M1 GHC.Generics.D t f) parK instance (WebApi.Param.GToParam f parK, GHC.Generics.Selector t) => WebApi.Param.GToParam (GHC.Generics.M1 GHC.Generics.S t f) parK instance WebApi.Param.ToParam WebApi.Param.Unit parK => WebApi.Param.GToParam GHC.Generics.U1 parK module WebApi.Versioning -- | A Style of versioning which has a Major version and a Minor version. data MajorMinor (ver :: (Nat, Nat)) MajorMinor :: MajorMinor -- | A Style of versioning which has only has a Major version. data Major (maj :: Nat) Major :: Major -- | Comparison between versions. class OrdVersion (ver :: *) where cmpVersion _ _ = (Proxy :: Proxy ord) cmpVersion :: (OrdVersion ver, ver ~ ((proxy :: k -> *) (v1 :: k)), ord ~ (VersionOrd (proxy v1) (proxy v2)), SingOrd ord) => proxy v1 -> proxy (v2 :: k) -> Proxy ord -- | Defines ordering of versions. -- | Comparison between two versions. Returns an Ord. -- --
--   >>> compareVersion (MajorMinor :: MajorMinor (0, 0)) (MajorMinor :: MajorMinor (0, 1)) == LT
--   True            
--   
compareVersion :: (OrdVersion (proxy v1), SingOrd (VersionOrd (proxy v1) (proxy v2))) => proxy (v1 :: k) -> proxy (v2 :: k) -> Ordering instance WebApi.Versioning.SingOrd 'GHC.Types.EQ instance WebApi.Versioning.SingOrd 'GHC.Types.LT instance WebApi.Versioning.SingOrd 'GHC.Types.GT instance WebApi.Versioning.OrdVersion (WebApi.Versioning.Major maj) instance WebApi.Versioning.OrdVersion (WebApi.Versioning.MajorMinor '(maj, min)) module WebApi.ContentTypes -- | Type representing content type of application/json. data JSON -- | Type representing content type of text/plain. data PlainText -- | Singleton class for content type. class Accept ctype contentType :: Accept ctype => Proxy ctype -> MediaType -- | Encode a type into a specific content type. class (Accept a) => Encode a c encode :: Encode a c => Proxy a -> c -> Builder -- | (Try to) Decode a type from a specific content type. class (Accept c) => Decode c a decode :: Decode c a => Proxy c -> ByteString -> Either String a class FromText a fromText :: FromText a => Text -> Maybe a class ToText a toText :: ToText a => a -> Text -- | Encodings of type for all content types ctypes. class Encodings (ctypes :: [*]) a encodings :: Encodings ctypes a => Proxy ctypes -> a -> [(MediaType, Builder)] -- | Decodings of type for all content types ctypes. class Decodings (ctypes :: [*]) a decodings :: Decodings ctypes a => Proxy ctypes -> ByteString -> [(MediaType, Either String a)] instance (WebApi.ContentTypes.Accept ctype, WebApi.ContentTypes.Encode ctype a, WebApi.ContentTypes.Encodings ctypes a) => WebApi.ContentTypes.Encodings (ctype : ctypes) a instance WebApi.ContentTypes.Encodings '[] a instance (WebApi.ContentTypes.Accept ctype, WebApi.ContentTypes.Decode ctype a, WebApi.ContentTypes.Decodings ctypes a) => WebApi.ContentTypes.Decodings (ctype : ctypes) a instance WebApi.ContentTypes.Decodings '[] a instance WebApi.ContentTypes.Accept WebApi.ContentTypes.JSON instance WebApi.ContentTypes.Accept WebApi.ContentTypes.PlainText instance WebApi.ContentTypes.Accept WebApi.ContentTypes.OctetStream instance Data.Aeson.Types.Class.ToJSON c => WebApi.ContentTypes.Encode WebApi.ContentTypes.JSON c instance WebApi.ContentTypes.ToText a => WebApi.ContentTypes.Encode WebApi.ContentTypes.PlainText a instance Data.Aeson.Types.Class.FromJSON a => WebApi.ContentTypes.Decode WebApi.ContentTypes.JSON a instance WebApi.ContentTypes.FromText a => WebApi.ContentTypes.Decode WebApi.ContentTypes.PlainText a instance WebApi.ContentTypes.ToText Data.Text.Internal.Text instance WebApi.ContentTypes.FromText Data.Text.Internal.Text -- | Provides the contract for the web api. The contract consists of -- WebApi and ApiContract classes. WebApi contains -- information related to the entire group of endpoints whereas -- ApiContract is concerned with information related to each end -- point. Once the contract is written, it can be then used to -- -- -- -- ... and possibly more. module WebApi.Contract -- | Describes a collection of web apis. class (OrdVersion (Version p)) => WebApi (p :: *) where type family Version p :: * type family Apis p :: [*] Version p = Major 0 -- | Describes a contract for a single API end point. class (SingMethod m, WebApi p) => ApiContract (p :: *) (m :: *) (r :: *) where type family PathParam m r type family QueryParam m r type family FormParam m r type family FileParam m r type family HeaderIn m r type family CookieIn m r type family ApiOut m r type family ApiErr m r type family HeaderOut m r type family CookieOut m r type family ContentTypes m r :: [*] PathParam m r = PathParam' m r QueryParam m r = () FormParam m r = () FileParam m r = () HeaderIn m r = () CookieIn m r = () CookieOut m r = () HeaderOut m r = () ApiErr m r = () ContentTypes m r = '[JSON] -- | Type of the path params that a route r has. If a custom -- routing system is being used, then you will have to give an instance -- for PathParam' for types being used in routing. Please take a -- look at the existing instances of PathParam' for reference. -- | Datatype representing a request to route r with method -- m. data Request m r Req :: PathParam m r -> QueryParam m r -> FormParam m r -> FileParam m r -> HeaderIn m r -> CookieIn m r -> Text -> Request m r -- | Path params of the request. [pathParam] :: Request m r -> PathParam m r -- | Query params of the request. [queryParam] :: Request m r -> QueryParam m r -- | Form params of the request. [formParam] :: Request m r -> FormParam m r -- | File params of the request. [fileParam] :: Request m r -> FileParam m r -- | Header params of the request. [headerIn] :: Request m r -> HeaderIn m r -- | Cookie params of the request. [cookieIn] :: Request m r -> CookieIn m r [method] :: Request m r -> Text -- | Datatype representing a response from route r with method -- m. data Response m r Success :: Status -> (ApiOut m r) -> (HeaderOut m r) -> (CookieOut m r) -> Response m r Failure :: (Either (ApiError m r) OtherError) -> Response m r -- | Datatype representing a known failure from route r with -- method m. data ApiError m r ApiError :: Status -> (ApiErr m r) -> Maybe (HeaderOut m r) -> Maybe (CookieOut m r) -> ApiError m r [code] :: ApiError m r -> Status [err] :: ApiError m r -> (ApiErr m r) [headerOut] :: ApiError m r -> Maybe (HeaderOut m r) [cookieOut] :: ApiError m r -> Maybe (CookieOut m r) -- | Datatype representing an unknown failure. data OtherError OtherError :: SomeException -> OtherError [exception] :: OtherError -> SomeException module WebApi.Internal data RouteResult a NotMatched :: RouteResult a Matched :: a -> RouteResult a type RoutingApplication = Request -> (RouteResult Response -> IO ResponseReceived) -> IO ResponseReceived toApplication :: RoutingApplication -> Application fromWaiRequest :: (FromParam (QueryParam m r) QueryParam, FromParam (FormParam m r) FormParam, FromParam (FileParam m r) FileParam, FromHeader (HeaderIn m r), FromParam (CookieIn m r) Cookie) => Request -> PathParam m r -> IO (Validation [ParamErr] (Request m r)) toWaiResponse :: (ToHeader (HeaderOut m r), ToParam (CookieOut m r) Cookie, Encodings (ContentTypes m r) (ApiOut m r), Encodings (ContentTypes m r) (ApiErr m r)) => Request -> Response m r -> Response -- | Generate a type safe URL for a given route type. The URI can be used -- for setting a base URL if required. link :: (ToParam (QueryParam m r) QueryParam, MkPathFormatString r, ToParam (PathParam m r) PathParam) => route m r -> URI -> PathParam m r -> Maybe (QueryParam m r) -> URI renderUriPath :: (ToParam path PathParam, MkPathFormatString r) => ByteString -> path -> route m r -> ByteString renderPaths :: (ToParam path PathParam, MkPathFormatString r) => path -> route m r -> ByteString -- | Describes the implementation of a single API end point corresponding -- to ApiContract (ApiInterface p) m r class (ApiContract (ApiInterface p) m r) => ApiHandler (p :: *) (m :: *) (r :: *) -- | Handler for the API end point which returns a Response. -- -- TODO : query type parameter is an experimental one used for -- trying out dependently typed params. This parameter will let us refine -- the ApiOut to the structure that is requested by the client. -- for eg : graph.facebook.com/bgolub?fields=id,name,picture -- -- This feature is not finalized and might get changed / removed. -- Currently the return type of handler is equivalent to `Response m r` handler :: (ApiHandler p m r, query ~ '[]) => Tagged query p -> Request m r -> HandlerM p (Query (Response m r) query) -- | Binds implementation to interface and provides a pluggable handler -- monad for the endpoint handler implementation. class (MonadCatch (HandlerM p), MonadIO (HandlerM p), WebApi (ApiInterface p)) => WebApiImplementation (p :: *) where type family HandlerM p :: * -> * type family ApiInterface p :: * HandlerM p = IO toIO _ = id -- | Create a value of IO a from HandlerM p a. toIO :: WebApiImplementation p => p -> HandlerM p a -> IO a -- | Type of settings of the server. data ServerSettings ServerSettings :: ServerSettings -- | Default server settings. serverSettings :: ServerSettings -- | Type of segments of a Path. data PathSegment -- | A static segment StaticSegment :: Text -> PathSegment -- | A dynamic segment Hole :: PathSegment -- | Describe representation of the route. class MkPathFormatString r -- | Given a route, this function should produce the [PathSegment] -- of that route. This gives the flexibility to hook in a different -- routing system into the application. mkPathFormatString :: MkPathFormatString r => Proxy r -> [PathSegment] -- | Type of Exception raised in a handler. data ApiException m r ApiException :: ApiError m r -> ApiException m r [apiException] :: ApiException m r -> ApiError m r handleApiException :: (query ~ '[], Monad (HandlerM p)) => p -> ApiException m r -> (HandlerM p) (Query (Response m r) query) handleSomeException :: (query ~ '[], Monad (HandlerM p)) => p -> SomeException -> (HandlerM p) (Query (Response m r) query) getCookie :: Request -> Maybe ByteString getAccept :: Request -> Maybe ByteString hSetCookie :: HeaderName getContentType :: Response a -> Maybe ByteString newtype Tagged (s :: [*]) b Tagged :: b -> Tagged b [unTagged] :: Tagged b -> b toTagged :: Proxy s -> b -> Tagged s b instance GHC.Show.Show WebApi.Internal.PathSegment instance GHC.Show.Show (WebApi.Internal.ApiException m r) instance (Data.Typeable.Internal.Typeable m, Data.Typeable.Internal.Typeable r) => GHC.Exception.Exception (WebApi.Internal.ApiException m r) -- | Provides a client for a web api for a given contract. module WebApi.Client -- | Given a Request type, create the request and obtain a response. -- Gives back a Response. client :: (CookieOut m r ~ (), ToParam (PathParam m r) PathParam, ToParam (QueryParam m r) QueryParam, ToParam (FormParam m r) FormParam, ToHeader (HeaderIn m r), ToParam (FileParam m r) FileParam, FromHeader (HeaderOut m r), Decodings (ContentTypes m r) (ApiOut m r), Decodings (ContentTypes m r) (ApiErr m r), ParamErrToApiErr (ApiErr m r), SingMethod m, MkPathFormatString r) => ClientSettings -> Request m r -> IO (Response m r) -- | Creates the Response type from the response body. fromClientResponse :: (FromHeader (HeaderOut m r), ParamErrToApiErr (ApiErr m r), Decodings (ContentTypes m r) (ApiOut m r), Decodings (ContentTypes m r) (ApiErr m r), CookieOut m r ~ ()) => Response BodyReader -> IO (Response m r) -- | Creates a request from the Request type. toClientRequest :: (ToParam (PathParam m r) PathParam, ToParam (QueryParam m r) QueryParam, ToParam (FormParam m r) FormParam, ToHeader (HeaderIn m r), ToParam (FileParam m r) FileParam, SingMethod m, MkPathFormatString r) => Request -> Request m r -> IO Request -- | Generate a type safe URL for a given route type. The URI can be used -- for setting a base URL if required. link :: (ToParam (QueryParam m r) QueryParam, MkPathFormatString r, ToParam (PathParam m r) PathParam) => route m r -> URI -> PathParam m r -> Maybe (QueryParam m r) -> URI -- | Datatype representing the settings related to client. data ClientSettings ClientSettings :: String -> Manager -> ClientSettings -- | base url of the API being called. [baseUrl] :: ClientSettings -> String -- | connection manager for the connection. [connectionManager] :: ClientSettings -> Manager -- | This exception is used to signal an irrecoverable error while -- deserializing the response. data UnknownClientException instance GHC.Show.Show WebApi.Client.UnknownClientException instance GHC.Exception.Exception WebApi.Client.UnknownClientException module WebApi.Router -- | Datatype representing a static path piece. data Static (s :: Symbol) type Root = Static "" -- | Datatype representing a route. data (:/) (p1 :: k) (p2 :: k1) -- | Datatype representing a endpoint. data Route (ms :: [*]) (r :: *) -- | Class to do the default routing. class Router (server :: *) (r :: k) (pr :: (*, [*])) route :: (Router server r pr, iface ~ (ApiInterface server)) => Proxy r -> server -> ParsedRoute pr -> RoutingApplication router :: (iface ~ (ApiInterface server), Router server apis '(CUSTOM "", '[])) => Proxy apis -> server -> RoutingApplication -- | Convert the path into a flat hierarchy. -- | Type of segments of a Path. data PathSegment -- | A static segment StaticSegment :: Text -> PathSegment -- | A dynamic segment Hole :: PathSegment -- | Describe representation of the route. class MkPathFormatString r -- | Given a route, this function should produce the [PathSegment] -- of that route. This gives the flexibility to hook in a different -- routing system into the application. mkPathFormatString :: MkPathFormatString r => Proxy r -> [PathSegment] instance (WebApi.Method.SingMethod m, WebApi.Router.Router s r '(m, '[]), WebApi.Router.Router s (WebApi.Router.Route ms r) pr) => WebApi.Router.Router s (WebApi.Router.Route (m : ms) r) pr instance WebApi.Router.Router s (WebApi.Router.Route '[] r) pr instance (WebApi.Router.Router s route pr, WebApi.Router.Router s routes pr) => WebApi.Router.Router s (route : routes) pr instance WebApi.Router.Router s '[] pr instance (WebApi.Router.Router s (WebApi.Router.MarkDyn rest) '(m, pp WebApi.Router.:++ '[WebApi.Router.DynamicPiece piece]), WebApi.Param.DecodeParam piece) => WebApi.Router.Router s (piece WebApi.Router.:/ rest) '(m, pp) instance (WebApi.Router.Router s (WebApi.Router.MarkDyn rest) '(m, pp WebApi.Router.:++ '[WebApi.Router.StaticPiece piece]), GHC.TypeLits.KnownSymbol piece) => WebApi.Router.Router s (piece WebApi.Router.:/ rest) '(m, pp) instance (GHC.TypeLits.KnownSymbol piece, WebApi.Internal.ApiHandler s m (WebApi.Router.Static piece), WebApi.Param.ToHeader (WebApi.Contract.HeaderOut m (WebApi.Router.Static piece)), WebApi.Param.ToParam (WebApi.Contract.CookieOut m (WebApi.Router.Static piece)) 'WebApi.Param.Cookie, WebApi.Param.FromParam (WebApi.Contract.QueryParam m (WebApi.Router.Static piece)) 'WebApi.Param.QueryParam, WebApi.Param.FromParam (WebApi.Contract.FormParam m (WebApi.Router.Static piece)) 'WebApi.Param.FormParam, WebApi.Param.FromParam (WebApi.Contract.FileParam m (WebApi.Router.Static piece)) 'WebApi.Param.FileParam, WebApi.Param.FromHeader (WebApi.Contract.HeaderIn m (WebApi.Router.Static piece)), WebApi.Param.FromParam (WebApi.Contract.CookieIn m (WebApi.Router.Static piece)) 'WebApi.Param.Cookie, WebApi.ContentTypes.Encodings (WebApi.Contract.ContentTypes m (WebApi.Router.Static piece)) (WebApi.Contract.ApiOut m (WebApi.Router.Static piece)), WebApi.ContentTypes.Encodings (WebApi.Contract.ContentTypes m (WebApi.Router.Static piece)) (WebApi.Contract.ApiErr m (WebApi.Router.Static piece)), WebApi.Contract.PathParam m (WebApi.Router.Static piece) ~ (), WebApi.Param.ParamErrToApiErr (WebApi.Contract.ApiErr m (WebApi.Router.Static piece)), Data.Typeable.Internal.Typeable m, Data.Typeable.Internal.Typeable (WebApi.Router.Static piece), WebApi.Internal.WebApiImplementation s) => WebApi.Router.Router s (WebApi.Router.Static piece) '(m, pp) instance (GHC.TypeLits.KnownSymbol lpiece, GHC.TypeLits.KnownSymbol rpiece, paths ~ (pp WebApi.Router.:++ '[WebApi.Router.StaticPiece lpiece, WebApi.Router.StaticPiece rpiece]), paths ~ ((pp WebApi.Router.:++ '[WebApi.Router.StaticPiece lpiece]) WebApi.Router.:++ '[WebApi.Router.StaticPiece rpiece]), route ~ WebApi.Router.FromPieces paths, WebApi.Internal.ApiHandler s m route, WebApi.Contract.PathParam m route ~ WebApi.Router.HListToTuple (WebApi.Router.FilterDynP paths), WebApi.Param.FromParam (WebApi.Contract.QueryParam m route) 'WebApi.Param.QueryParam, WebApi.Param.FromParam (WebApi.Contract.FormParam m route) 'WebApi.Param.FormParam, WebApi.Param.FromParam (WebApi.Contract.FileParam m route) 'WebApi.Param.FileParam, WebApi.Param.FromParam (WebApi.Contract.CookieIn m route) 'WebApi.Param.Cookie, WebApi.Param.FromHeader (WebApi.Contract.HeaderIn m route), WebApi.ContentTypes.Encodings (WebApi.Contract.ContentTypes m route) (WebApi.Contract.ApiErr m route), WebApi.ContentTypes.Encodings (WebApi.Contract.ContentTypes m route) (WebApi.Contract.ApiOut m route), WebApi.Param.ToHeader (WebApi.Contract.HeaderOut m route), WebApi.Param.ToParam (WebApi.Contract.CookieOut m route) 'WebApi.Param.Cookie, WebApi.Param.ParamErrToApiErr (WebApi.Contract.ApiErr m route), Data.Typeable.Internal.Typeable m, Data.Typeable.Internal.Typeable route, WebApi.Internal.WebApiImplementation s) => WebApi.Router.Router s (lpiece WebApi.Router.:/ rpiece) '(m, pp) instance (GHC.TypeLits.KnownSymbol rpiece, paths ~ (pp WebApi.Router.:++ '[WebApi.Router.DynamicPiece lpiece, WebApi.Router.StaticPiece rpiece]), paths ~ ((pp WebApi.Router.:++ '[WebApi.Router.DynamicPiece lpiece]) WebApi.Router.:++ '[WebApi.Router.StaticPiece rpiece]), route ~ WebApi.Router.FromPieces paths, WebApi.Internal.ApiHandler s m route, WebApi.Contract.PathParam m route ~ WebApi.Router.HListToTuple (WebApi.Router.FilterDynP paths), WebApi.Param.FromParam (WebApi.Contract.QueryParam m route) 'WebApi.Param.QueryParam, WebApi.Param.FromParam (WebApi.Contract.FormParam m route) 'WebApi.Param.FormParam, WebApi.Param.FromParam (WebApi.Contract.FileParam m route) 'WebApi.Param.FileParam, WebApi.Param.FromParam (WebApi.Contract.CookieIn m route) 'WebApi.Param.Cookie, WebApi.Param.FromHeader (WebApi.Contract.HeaderIn m route), WebApi.ContentTypes.Encodings (WebApi.Contract.ContentTypes m route) (WebApi.Contract.ApiErr m route), WebApi.ContentTypes.Encodings (WebApi.Contract.ContentTypes m route) (WebApi.Contract.ApiOut m route), WebApi.Param.ToHeader (WebApi.Contract.HeaderOut m route), WebApi.Param.ToParam (WebApi.Contract.CookieOut m route) 'WebApi.Param.Cookie, WebApi.Param.DecodeParam lpiece, WebApi.Param.ParamErrToApiErr (WebApi.Contract.ApiErr m route), Data.Typeable.Internal.Typeable m, Data.Typeable.Internal.Typeable route, WebApi.Internal.WebApiImplementation s) => WebApi.Router.Router s (lpiece WebApi.Router.:/ rpiece) '(m, pp) instance (route ~ WebApi.Router.FromPieces (pp WebApi.Router.:++ '[WebApi.Router.DynamicPiece t]), WebApi.Internal.ApiHandler s m route, WebApi.Contract.PathParam m route ~ WebApi.Router.HListToTuple (WebApi.Router.FilterDynP (pp WebApi.Router.:++ '[WebApi.Router.DynamicPiece t])), WebApi.Param.FromParam (WebApi.Contract.QueryParam m route) 'WebApi.Param.QueryParam, WebApi.Param.FromParam (WebApi.Contract.FormParam m route) 'WebApi.Param.FormParam, WebApi.Param.FromParam (WebApi.Contract.FileParam m route) 'WebApi.Param.FileParam, WebApi.Param.FromParam (WebApi.Contract.CookieIn m route) 'WebApi.Param.Cookie, WebApi.Param.FromHeader (WebApi.Contract.HeaderIn m route), WebApi.ContentTypes.Encodings (WebApi.Contract.ContentTypes m route) (WebApi.Contract.ApiErr m route), WebApi.ContentTypes.Encodings (WebApi.Contract.ContentTypes m route) (WebApi.Contract.ApiOut m route), WebApi.Param.ToHeader (WebApi.Contract.HeaderOut m route), WebApi.Param.ToParam (WebApi.Contract.CookieOut m route) 'WebApi.Param.Cookie, WebApi.Param.DecodeParam t, WebApi.Param.ParamErrToApiErr (WebApi.Contract.ApiErr m route), Data.Typeable.Internal.Typeable m, Data.Typeable.Internal.Typeable route, WebApi.Internal.WebApiImplementation s) => WebApi.Router.Router s (WebApi.Router.DynamicPiece t) '(m, pp) instance forall (k :: BOX) (k1 :: BOX) (a :: k) (b :: k1). WebApi.Router.MkFormatStr (WebApi.Router.ToPieces (a WebApi.Router.:/ b)) => WebApi.Internal.MkPathFormatString (a WebApi.Router.:/ b) instance GHC.TypeLits.KnownSymbol s => WebApi.Internal.MkPathFormatString (WebApi.Router.Static s) instance (GHC.TypeLits.KnownSymbol s, WebApi.Router.MkFormatStr xs) => WebApi.Router.MkFormatStr (WebApi.Router.StaticPiece s : xs) instance WebApi.Router.MkFormatStr xs => WebApi.Router.MkFormatStr (WebApi.Router.DynamicPiece s : xs) instance WebApi.Router.MkFormatStr '[] -- | Provides the implementation of web api. Given a contract, an -- implementation of the web api can be provided by using -- WebApiImplementation and ApiHandler. -- WebApiImplementation has the information pertaining to web api -- as a whole. ApiHandler provides a way to write the handler for -- a particular API end point. -- -- Comparing with the WebApi.Contract, WebApi and -- ApiContract has the same relationship as -- WebApiImplementation and ApiHandler. module WebApi.Server -- | Create a WAI application from the information specified in -- WebApiImplementation, WebApi, ApiContract and -- ApiHandler classes. serverApp :: (iface ~ (ApiInterface server), Router server (Apis iface) '(CUSTOM "", '[])) => ServerSettings -> server -> Application -- | Default server settings. serverSettings :: ServerSettings -- | Type of settings of the server. data ServerSettings -- | Describes the implementation of a single API end point corresponding -- to ApiContract (ApiInterface p) m r class (ApiContract (ApiInterface p) m r) => ApiHandler (p :: *) (m :: *) (r :: *) -- | Handler for the API end point which returns a Response. -- -- TODO : query type parameter is an experimental one used for -- trying out dependently typed params. This parameter will let us refine -- the ApiOut to the structure that is requested by the client. -- for eg : graph.facebook.com/bgolub?fields=id,name,picture -- -- This feature is not finalized and might get changed / removed. -- Currently the return type of handler is equivalent to `Response m r` handler :: (ApiHandler p m r, query ~ '[]) => Tagged query p -> Request m r -> HandlerM p (Query (Response m r) query) -- | Type of Exception raised in a handler. data ApiException m r ApiException :: ApiError m r -> ApiException m r [apiException] :: ApiException m r -> ApiError m r -- | Binds implementation to interface and provides a pluggable handler -- monad for the endpoint handler implementation. class (MonadCatch (HandlerM p), MonadIO (HandlerM p), WebApi (ApiInterface p)) => WebApiImplementation (p :: *) where type family HandlerM p :: * -> * type family ApiInterface p :: * HandlerM p = IO toIO _ = id -- | Create a value of IO a from HandlerM p a. toIO :: WebApiImplementation p => p -> HandlerM p a -> IO a -- | Creates a successful response from its components. It is assumed that -- HeaderOut and CookieOut has default definitions. respond :: (Monad handM, (HeaderOut m r) ~ (), (CookieOut m r) ~ ()) => ApiOut m r -> handM (Response m r) -- | Creates a successful response from its components. respondWith :: (Monad handM) => Status -> ApiOut m r -> HeaderOut m r -> CookieOut m r -> handM (Response m r) -- | This function short circuits returning an ApiError.It is -- assumed that HeaderOut and CookieOut has default -- definitions. raise :: (MonadThrow handM, Typeable m, Typeable r) => Status -> ApiErr m r -> handM (Response m r) -- | This function short circuits returning an ApiError. raiseWith :: (Monad handM, MonadThrow handM, Typeable m, Typeable r) => Status -> ApiErr m r -> HeaderOut m r -> CookieOut m r -> handM (Response m r) unTagged :: Tagged s b -> b toTagged :: Proxy s -> b -> Tagged s b -- | Generate a type safe URL for a given route type. The URI can be used -- for setting a base URL if required. link :: (ToParam (QueryParam m r) QueryParam, MkPathFormatString r, ToParam (PathParam m r) PathParam) => route m r -> URI -> PathParam m r -> Maybe (QueryParam m r) -> URI -- | Once a contract is defined for a web api, a mock server and client for -- it can be obtained. Arbitrary instances of the data types used -- in Request and Response is used to generate the request -- and response. Note that if a different mocking behaviour is required, -- it is easy enough to write a different implementation. Please take a -- look at the reference implementation of MockServer for details. module WebApi.Mock -- | Default mock server settings. mockServerSettings :: MockServerSettings -- | Create a mock response from endpoint information and -- MockServerSettings mockResponse :: (Arbitrary (ApiOut m r), Arbitrary (HeaderOut m r), Arbitrary (CookieOut m r), Arbitrary (ApiErr m r), Typeable m, Typeable r) => route m r -> MockServerSettings -> IO (Response m r) -- | Create a mock server. mockServer :: (Router (MockServer p) (Apis p) '(CUSTOM "", '[])) => ServerSettings -> MockServer p -> Application -- | Datatype representing a mock server. The parameterization over -- p allows it to be a mock server for any p. newtype MockServer p MockServer :: MockServerSettings -> MockServer p [mockServerSett] :: MockServer p -> MockServerSettings -- | Settings related to mock server. data MockServerSettings MockServerSettings :: ResponseData -> MockServerSettings [responseData] :: MockServerSettings -> ResponseData -- | Datatype representing a mock exception. This exception will be put -- inside OtherError. data MockServerException MockServerException :: String -> MockServerException [exceptionMsg] :: MockServerException -> String -- | Determine the data constructor of Response to be generated in -- mockServer. data ResponseData SuccessData :: ResponseData ApiErrorData :: Status -> ResponseData OtherErrorData :: ResponseData -- | Create a mock client. mockClient :: (Arbitrary (PathParam m r), Arbitrary (QueryParam m r), Arbitrary (FormParam m r), Arbitrary (FileParam m r), Arbitrary (HeaderIn m r), Arbitrary (CookieIn m r), SingMethod m) => route m r -> IO (Request m r) instance GHC.Generics.Selector WebApi.Mock.S1_0_0MockServerException instance GHC.Generics.Constructor WebApi.Mock.C1_0MockServerException instance GHC.Generics.Datatype WebApi.Mock.D1MockServerException instance GHC.Generics.Generic WebApi.Mock.MockServerException instance GHC.Show.Show WebApi.Mock.MockServerException instance GHC.Show.Show (WebApi.Mock.MockServer p) instance GHC.Classes.Eq (WebApi.Mock.MockServer p) instance GHC.Show.Show WebApi.Mock.MockServerSettings instance GHC.Classes.Eq WebApi.Mock.MockServerSettings instance GHC.Show.Show WebApi.Mock.ResponseData instance GHC.Classes.Eq WebApi.Mock.ResponseData instance WebApi.Contract.WebApi p => WebApi.Internal.WebApiImplementation (WebApi.Mock.MockServer p) instance (WebApi.Contract.ApiContract p m r, Test.QuickCheck.Arbitrary.Arbitrary (WebApi.Contract.ApiOut m r), Test.QuickCheck.Arbitrary.Arbitrary (WebApi.Contract.ApiErr m r), Test.QuickCheck.Arbitrary.Arbitrary (WebApi.Contract.HeaderOut m r), Test.QuickCheck.Arbitrary.Arbitrary (WebApi.Contract.CookieOut m r), Data.Typeable.Internal.Typeable m, Data.Typeable.Internal.Typeable r) => WebApi.Internal.ApiHandler (WebApi.Mock.MockServer p) m r instance GHC.Exception.Exception WebApi.Mock.MockServerException module WebApi