Merge pull request #680 from phadej/stylish-haskell
Update .stylish-haskell
This commit is contained in:
commit
6d1ae0dccd
27 changed files with 406 additions and 205 deletions
|
@ -15,6 +15,14 @@ steps:
|
||||||
# # true.
|
# # true.
|
||||||
# add_language_pragma: true
|
# add_language_pragma: true
|
||||||
|
|
||||||
|
# Align the right hand side of some elements. This is quite conservative
|
||||||
|
# and only applies to statements where each element occupies a single
|
||||||
|
# line.
|
||||||
|
- simple_align:
|
||||||
|
cases: false
|
||||||
|
top_level_patterns: false
|
||||||
|
records: false
|
||||||
|
|
||||||
# Import cleanup
|
# Import cleanup
|
||||||
- imports:
|
- imports:
|
||||||
# There are different ways we can align names and lists.
|
# There are different ways we can align names and lists.
|
||||||
|
@ -33,6 +41,91 @@ steps:
|
||||||
# Default: global.
|
# Default: global.
|
||||||
align: global
|
align: global
|
||||||
|
|
||||||
|
# Folowing options affect only import list alignment.
|
||||||
|
#
|
||||||
|
# List align has following options:
|
||||||
|
#
|
||||||
|
# - after_alias: Import list is aligned with end of import including
|
||||||
|
# 'as' and 'hiding' keywords.
|
||||||
|
#
|
||||||
|
# > import qualified Data.List as List (concat, foldl, foldr, head,
|
||||||
|
# > init, last, length)
|
||||||
|
#
|
||||||
|
# - with_alias: Import list is aligned with start of alias or hiding.
|
||||||
|
#
|
||||||
|
# > import qualified Data.List as List (concat, foldl, foldr, head,
|
||||||
|
# > init, last, length)
|
||||||
|
#
|
||||||
|
# - new_line: Import list starts always on new line.
|
||||||
|
#
|
||||||
|
# > import qualified Data.List as List
|
||||||
|
# > (concat, foldl, foldr, head, init, last, length)
|
||||||
|
#
|
||||||
|
# Default: after_alias
|
||||||
|
list_align: new_line
|
||||||
|
|
||||||
|
# Long list align style takes effect when import is too long. This is
|
||||||
|
# determined by 'columns' setting.
|
||||||
|
#
|
||||||
|
# - inline: This option will put as much specs on same line as possible.
|
||||||
|
#
|
||||||
|
# - new_line: Import list will start on new line.
|
||||||
|
#
|
||||||
|
# - new_line_multiline: Import list will start on new line when it's
|
||||||
|
# short enough to fit to single line. Otherwise it'll be multiline.
|
||||||
|
#
|
||||||
|
# - multiline: One line per import list entry.
|
||||||
|
# Type with contructor list acts like single import.
|
||||||
|
#
|
||||||
|
# > import qualified Data.Map as M
|
||||||
|
# > ( empty
|
||||||
|
# > , singleton
|
||||||
|
# > , ...
|
||||||
|
# > , delete
|
||||||
|
# > )
|
||||||
|
#
|
||||||
|
# Default: inline
|
||||||
|
long_list_align: new_line
|
||||||
|
|
||||||
|
# Align empty list (importing instances)
|
||||||
|
#
|
||||||
|
# Empty list align has following options
|
||||||
|
#
|
||||||
|
# - inherit: inherit list_align setting
|
||||||
|
#
|
||||||
|
# - right_after: () is right after the module name:
|
||||||
|
#
|
||||||
|
# > import Vector.Instances ()
|
||||||
|
#
|
||||||
|
# Default: inherit
|
||||||
|
empty_list_align: right_after
|
||||||
|
|
||||||
|
# List padding determines indentation of import list on lines after import.
|
||||||
|
# This option affects 'long_list_align'.
|
||||||
|
#
|
||||||
|
# - <integer>: constant value
|
||||||
|
#
|
||||||
|
# - module_name: align under start of module name.
|
||||||
|
# Useful for 'file' and 'group' align settings.
|
||||||
|
list_padding: module_name
|
||||||
|
|
||||||
|
# Separate lists option affects formating of import list for type
|
||||||
|
# or class. The only difference is single space between type and list
|
||||||
|
# of constructors, selectors and class functions.
|
||||||
|
#
|
||||||
|
# - true: There is single space between Foldable type and list of it's
|
||||||
|
# functions.
|
||||||
|
#
|
||||||
|
# > import Data.Foldable (Foldable (fold, foldl, foldMap))
|
||||||
|
#
|
||||||
|
# - false: There is no space between Foldable type and list of it's
|
||||||
|
# functions.
|
||||||
|
#
|
||||||
|
# > import Data.Foldable (Foldable(fold, foldl, foldMap))
|
||||||
|
#
|
||||||
|
# Default: true
|
||||||
|
separate_lists: true
|
||||||
|
|
||||||
# Language pragmas
|
# Language pragmas
|
||||||
- language_pragmas:
|
- language_pragmas:
|
||||||
# We can generate different styles of language pragma lists.
|
# We can generate different styles of language pragma lists.
|
||||||
|
@ -47,13 +140,20 @@ steps:
|
||||||
# Default: vertical.
|
# Default: vertical.
|
||||||
style: vertical
|
style: vertical
|
||||||
|
|
||||||
|
# Align affects alignment of closing pragma brackets.
|
||||||
|
#
|
||||||
|
# - true: Brackets are aligned in same collumn.
|
||||||
|
#
|
||||||
|
# - false: Brackets are not aligned together. There is only one space
|
||||||
|
# between actual import and closing bracket.
|
||||||
|
#
|
||||||
|
# Default: true
|
||||||
|
align: true
|
||||||
|
|
||||||
# stylish-haskell can detect redundancy of some language pragmas. If this
|
# stylish-haskell can detect redundancy of some language pragmas. If this
|
||||||
# is set to true, it will remove those redundant pragmas. Default: true.
|
# is set to true, it will remove those redundant pragmas. Default: true.
|
||||||
remove_redundant: true
|
remove_redundant: true
|
||||||
|
|
||||||
# Align the types in record declarations
|
|
||||||
- records: {}
|
|
||||||
|
|
||||||
# Replace tabs by spaces. This is disabled by default.
|
# Replace tabs by spaces. This is disabled by default.
|
||||||
# - tabs:
|
# - tabs:
|
||||||
# # Number of spaces to use for each tab. Default: 8, as specified by the
|
# # Number of spaces to use for each tab. Default: 8, as specified by the
|
||||||
|
@ -67,11 +167,24 @@ steps:
|
||||||
# to. Different steps take this into account. Default: 80.
|
# to. Different steps take this into account. Default: 80.
|
||||||
columns: 80
|
columns: 80
|
||||||
|
|
||||||
|
# By default, line endings are converted according to the OS. You can override
|
||||||
|
# preferred format here.
|
||||||
|
#
|
||||||
|
# - native: Native newline format. CRLF on Windows, LF on other OSes.
|
||||||
|
#
|
||||||
|
# - lf: Convert to LF ("\n").
|
||||||
|
#
|
||||||
|
# - crlf: Convert to CRLF ("\r\n").
|
||||||
|
#
|
||||||
|
# Default: native.
|
||||||
|
newline: lf
|
||||||
|
|
||||||
# Sometimes, language extensions are specified in a cabal file or from the
|
# Sometimes, language extensions are specified in a cabal file or from the
|
||||||
# command line instead of using language pragmas in the file. stylish-haskell
|
# command line instead of using language pragmas in the file. stylish-haskell
|
||||||
# needs to be aware of these, so it can parse the file correctly.
|
# needs to be aware of these, so it can parse the file correctly.
|
||||||
#
|
#
|
||||||
# No language extensions are enabled by default.
|
# No language extensions are enabled by default.
|
||||||
language_extensions:
|
language_extensions:
|
||||||
- TemplateHaskell
|
- FlexibleContexts
|
||||||
- QuasiQuotes
|
- TemplateHaskell
|
||||||
|
- QuasiQuotes
|
||||||
|
|
|
@ -66,71 +66,75 @@ module Servant.API (
|
||||||
-- * Utilities
|
-- * Utilities
|
||||||
module Servant.Utils.Links,
|
module Servant.Utils.Links,
|
||||||
-- | Type-safe internal URIs
|
-- | Type-safe internal URIs
|
||||||
|
|
||||||
-- * Re-exports
|
-- * Re-exports
|
||||||
If,
|
If,
|
||||||
SBool (..), SBoolI (..)
|
SBool (..), SBoolI (..)
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Servant.API.Alternative ((:<|>) (..))
|
import Data.Singletons.Bool
|
||||||
import Servant.API.BasicAuth (BasicAuth,BasicAuthData(..))
|
(SBool (..), SBoolI (..))
|
||||||
import Servant.API.Capture (Capture, Capture', CaptureAll)
|
import Data.Type.Bool
|
||||||
import Servant.API.ContentTypes (Accept (..), FormUrlEncoded,
|
(If)
|
||||||
JSON,
|
import Servant.API.Alternative
|
||||||
MimeRender (..), NoContent (NoContent),
|
((:<|>) (..))
|
||||||
MimeUnrender (..), OctetStream,
|
import Servant.API.BasicAuth
|
||||||
PlainText)
|
(BasicAuth, BasicAuthData (..))
|
||||||
import Servant.API.Description (Description, Summary)
|
import Servant.API.Capture
|
||||||
import Servant.API.Empty (EmptyAPI (..))
|
(Capture, Capture', CaptureAll)
|
||||||
import Servant.API.Experimental.Auth (AuthProtect)
|
import Servant.API.ContentTypes
|
||||||
import Servant.API.Header (Header, Header')
|
(Accept (..), FormUrlEncoded, JSON, MimeRender (..),
|
||||||
import Servant.API.HttpVersion (HttpVersion (..))
|
MimeUnrender (..), NoContent (NoContent), OctetStream,
|
||||||
import Servant.API.IsSecure (IsSecure (..))
|
PlainText)
|
||||||
import Servant.API.Modifiers (Required, Optional, Lenient, Strict)
|
import Servant.API.Description
|
||||||
import Servant.API.QueryParam (QueryFlag, QueryParam, QueryParam',
|
(Description, Summary)
|
||||||
QueryParams)
|
import Servant.API.Empty
|
||||||
import Servant.API.Raw (Raw)
|
(EmptyAPI (..))
|
||||||
import Servant.API.Stream (Stream, StreamGet, StreamPost,
|
import Servant.API.Experimental.Auth
|
||||||
StreamGenerator (..),
|
(AuthProtect)
|
||||||
ToStreamGenerator (..),
|
import Servant.API.Header
|
||||||
ResultStream(..), BuildFromStream (..),
|
(Header, Header')
|
||||||
ByteStringParser (..),
|
import Servant.API.HttpVersion
|
||||||
FramingRender (..), BoundaryStrategy (..),
|
(HttpVersion (..))
|
||||||
FramingUnrender (..),
|
import Servant.API.IsSecure
|
||||||
NewlineFraming,
|
(IsSecure (..))
|
||||||
NetstringFraming)
|
import Servant.API.Modifiers
|
||||||
import Servant.API.RemoteHost (RemoteHost)
|
(Lenient, Optional, Required, Strict)
|
||||||
import Servant.API.ReqBody (ReqBody, ReqBody')
|
import Servant.API.QueryParam
|
||||||
import Servant.API.ResponseHeaders (AddHeader, addHeader, noHeader,
|
(QueryFlag, QueryParam, QueryParam', QueryParams)
|
||||||
BuildHeadersTo (buildHeadersTo),
|
import Servant.API.Raw
|
||||||
GetHeaders (getHeaders),
|
(Raw)
|
||||||
HList (..), Headers (..),
|
import Servant.API.RemoteHost
|
||||||
getHeadersHList, getResponse, ResponseHeader (..))
|
(RemoteHost)
|
||||||
import Servant.API.Sub ((:>))
|
import Servant.API.ReqBody
|
||||||
import Servant.API.Vault (Vault)
|
(ReqBody, ReqBody')
|
||||||
import Servant.API.Verbs (PostCreated, Delete, DeleteAccepted,
|
import Servant.API.ResponseHeaders
|
||||||
DeleteNoContent,
|
(AddHeader, BuildHeadersTo (buildHeadersTo),
|
||||||
DeleteNonAuthoritative, Get,
|
GetHeaders (getHeaders), HList (..), Headers (..),
|
||||||
GetAccepted, GetNoContent,
|
ResponseHeader (..), addHeader, getHeadersHList, getResponse,
|
||||||
GetNonAuthoritative,
|
noHeader)
|
||||||
GetPartialContent,
|
import Servant.API.Stream
|
||||||
GetResetContent,
|
(BoundaryStrategy (..), BuildFromStream (..),
|
||||||
Patch,
|
ByteStringParser (..), FramingRender (..),
|
||||||
PatchAccepted, PatchNoContent,
|
FramingUnrender (..), NetstringFraming, NewlineFraming,
|
||||||
PatchNoContent,
|
ResultStream (..), Stream, StreamGenerator (..), StreamGet,
|
||||||
PatchNonAuthoritative, Post,
|
StreamPost, ToStreamGenerator (..))
|
||||||
PostAccepted, PostNoContent,
|
import Servant.API.Sub
|
||||||
PostNonAuthoritative,
|
((:>))
|
||||||
PostResetContent, Put,
|
import Servant.API.Vault
|
||||||
PutAccepted, PutNoContent,
|
(Vault)
|
||||||
PutNoContent, PutNonAuthoritative,
|
import Servant.API.Verbs
|
||||||
ReflectMethod (reflectMethod),
|
(Delete, DeleteAccepted, DeleteNoContent,
|
||||||
Verb, StdMethod(..))
|
DeleteNonAuthoritative, Get, GetAccepted, GetNoContent,
|
||||||
import Servant.API.WithNamedContext (WithNamedContext)
|
GetNonAuthoritative, GetPartialContent, GetResetContent,
|
||||||
import Servant.Utils.Links (HasLink (..), Link, IsElem, IsElem',
|
Patch, PatchAccepted, PatchNoContent, PatchNonAuthoritative,
|
||||||
URI (..), safeLink)
|
Post, PostAccepted, PostCreated, PostNoContent,
|
||||||
import Web.HttpApiData (FromHttpApiData (..),
|
PostNonAuthoritative, PostResetContent, Put, PutAccepted,
|
||||||
ToHttpApiData (..))
|
PutNoContent, PutNonAuthoritative,
|
||||||
|
ReflectMethod (reflectMethod), StdMethod (..), Verb)
|
||||||
import Data.Type.Bool (If)
|
import Servant.API.WithNamedContext
|
||||||
import Data.Singletons.Bool (SBool (..), SBoolI (..))
|
(WithNamedContext)
|
||||||
|
import Servant.Utils.Links
|
||||||
|
(HasLink (..), IsElem, IsElem', Link, URI (..), safeLink)
|
||||||
|
import Web.HttpApiData
|
||||||
|
(FromHttpApiData (..), ToHttpApiData (..))
|
||||||
|
|
|
@ -1,14 +1,16 @@
|
||||||
{-# LANGUAGE CPP #-}
|
{-# LANGUAGE CPP #-}
|
||||||
{-# LANGUAGE DeriveDataTypeable #-}
|
{-# LANGUAGE DeriveDataTypeable #-}
|
||||||
{-# LANGUAGE DeriveFunctor #-}
|
|
||||||
{-# LANGUAGE DeriveFoldable #-}
|
{-# LANGUAGE DeriveFoldable #-}
|
||||||
|
{-# LANGUAGE DeriveFunctor #-}
|
||||||
{-# LANGUAGE DeriveTraversable #-}
|
{-# LANGUAGE DeriveTraversable #-}
|
||||||
{-# LANGUAGE TypeOperators #-}
|
{-# LANGUAGE TypeOperators #-}
|
||||||
{-# OPTIONS_HADDOCK not-home #-}
|
{-# OPTIONS_HADDOCK not-home #-}
|
||||||
module Servant.API.Alternative ((:<|>)(..)) where
|
module Servant.API.Alternative ((:<|>)(..)) where
|
||||||
|
|
||||||
import Data.Semigroup (Semigroup (..))
|
import Data.Semigroup
|
||||||
import Data.Typeable (Typeable)
|
(Semigroup (..))
|
||||||
|
import Data.Typeable
|
||||||
|
(Typeable)
|
||||||
import Prelude ()
|
import Prelude ()
|
||||||
import Prelude.Compat
|
import Prelude.Compat
|
||||||
|
|
||||||
|
|
|
@ -1,13 +1,16 @@
|
||||||
{-# LANGUAGE DataKinds #-}
|
{-# LANGUAGE DataKinds #-}
|
||||||
{-# LANGUAGE DeriveDataTypeable #-}
|
{-# LANGUAGE DeriveDataTypeable #-}
|
||||||
{-# LANGUAGE KindSignatures #-}
|
{-# LANGUAGE KindSignatures #-}
|
||||||
{-# LANGUAGE PolyKinds #-}
|
{-# LANGUAGE PolyKinds #-}
|
||||||
|
|
||||||
module Servant.API.BasicAuth where
|
module Servant.API.BasicAuth where
|
||||||
|
|
||||||
import Data.ByteString (ByteString)
|
import Data.ByteString
|
||||||
import Data.Typeable (Typeable)
|
(ByteString)
|
||||||
import GHC.TypeLits (Symbol)
|
import Data.Typeable
|
||||||
|
(Typeable)
|
||||||
|
import GHC.TypeLits
|
||||||
|
(Symbol)
|
||||||
|
|
||||||
|
|
||||||
-- | Combinator for <https://tools.ietf.org/html/rfc2617#section-2 Basic Access Authentication>.
|
-- | Combinator for <https://tools.ietf.org/html/rfc2617#section-2 Basic Access Authentication>.
|
||||||
|
|
|
@ -4,8 +4,10 @@
|
||||||
{-# OPTIONS_HADDOCK not-home #-}
|
{-# OPTIONS_HADDOCK not-home #-}
|
||||||
module Servant.API.Capture (Capture, Capture', CaptureAll) where
|
module Servant.API.Capture (Capture, Capture', CaptureAll) where
|
||||||
|
|
||||||
import Data.Typeable (Typeable)
|
import Data.Typeable
|
||||||
import GHC.TypeLits (Symbol)
|
(Typeable)
|
||||||
|
import GHC.TypeLits
|
||||||
|
(Symbol)
|
||||||
-- | Capture a value from the request path under a certain type @a@.
|
-- | Capture a value from the request path under a certain type @a@.
|
||||||
--
|
--
|
||||||
-- Example:
|
-- Example:
|
||||||
|
|
|
@ -71,32 +71,38 @@ module Servant.API.ContentTypes
|
||||||
, canHandleAcceptH
|
, canHandleAcceptH
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Control.Arrow (left)
|
import Control.Arrow
|
||||||
|
(left)
|
||||||
import Control.Monad.Compat
|
import Control.Monad.Compat
|
||||||
import Data.Aeson (FromJSON(..), ToJSON(..), encode)
|
import Data.Aeson
|
||||||
import Data.Aeson.Parser (value)
|
(FromJSON (..), ToJSON (..), encode)
|
||||||
import Data.Aeson.Types (parseEither)
|
import Data.Aeson.Parser
|
||||||
import Data.Attoparsec.ByteString.Char8 (endOfInput, parseOnly,
|
(value)
|
||||||
skipSpace, (<?>))
|
import Data.Aeson.Types
|
||||||
|
(parseEither)
|
||||||
|
import Data.Attoparsec.ByteString.Char8
|
||||||
|
(endOfInput, parseOnly, skipSpace, (<?>))
|
||||||
import qualified Data.ByteString as BS
|
import qualified Data.ByteString as BS
|
||||||
import Data.ByteString.Lazy (ByteString, fromStrict,
|
import Data.ByteString.Lazy
|
||||||
toStrict)
|
(ByteString, fromStrict, toStrict)
|
||||||
import qualified Data.ByteString.Lazy.Char8 as BC
|
import qualified Data.ByteString.Lazy.Char8 as BC
|
||||||
import qualified Data.List.NonEmpty as NE
|
import qualified Data.List.NonEmpty as NE
|
||||||
import Data.Maybe (isJust)
|
import Data.Maybe
|
||||||
import Data.String.Conversions (cs)
|
(isJust)
|
||||||
|
import Data.String.Conversions
|
||||||
|
(cs)
|
||||||
import qualified Data.Text as TextS
|
import qualified Data.Text as TextS
|
||||||
import qualified Data.Text.Encoding as TextS
|
import qualified Data.Text.Encoding as TextS
|
||||||
import qualified Data.Text.Lazy as TextL
|
import qualified Data.Text.Lazy as TextL
|
||||||
import qualified Data.Text.Lazy.Encoding as TextL
|
import qualified Data.Text.Lazy.Encoding as TextL
|
||||||
import Data.Typeable
|
import Data.Typeable
|
||||||
import GHC.Generics (Generic)
|
import GHC.Generics
|
||||||
|
(Generic)
|
||||||
import qualified Network.HTTP.Media as M
|
import qualified Network.HTTP.Media as M
|
||||||
import Web.FormUrlEncoded (FromForm, ToForm,
|
import Prelude ()
|
||||||
urlEncodeAsForm,
|
|
||||||
urlDecodeAsForm)
|
|
||||||
import Prelude ()
|
|
||||||
import Prelude.Compat
|
import Prelude.Compat
|
||||||
|
import Web.FormUrlEncoded
|
||||||
|
(FromForm, ToForm, urlDecodeAsForm, urlEncodeAsForm)
|
||||||
|
|
||||||
#if MIN_VERSION_base(4,9,0)
|
#if MIN_VERSION_base(4,9,0)
|
||||||
import qualified GHC.TypeLits as TL
|
import qualified GHC.TypeLits as TL
|
||||||
|
|
|
@ -3,8 +3,8 @@
|
||||||
{-# LANGUAGE FlexibleContexts #-}
|
{-# LANGUAGE FlexibleContexts #-}
|
||||||
{-# LANGUAGE PolyKinds #-}
|
{-# LANGUAGE PolyKinds #-}
|
||||||
{-# LANGUAGE ScopedTypeVariables #-}
|
{-# LANGUAGE ScopedTypeVariables #-}
|
||||||
{-# LANGUAGE TypeOperators #-}
|
|
||||||
{-# LANGUAGE TypeFamilies #-}
|
{-# LANGUAGE TypeFamilies #-}
|
||||||
|
{-# LANGUAGE TypeOperators #-}
|
||||||
{-# OPTIONS_HADDOCK not-home #-}
|
{-# OPTIONS_HADDOCK not-home #-}
|
||||||
module Servant.API.Description (
|
module Servant.API.Description (
|
||||||
-- * Combinators
|
-- * Combinators
|
||||||
|
@ -16,9 +16,12 @@ module Servant.API.Description (
|
||||||
reflectDescription,
|
reflectDescription,
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Data.Typeable (Typeable)
|
import Data.Proxy
|
||||||
import GHC.TypeLits (Symbol, KnownSymbol, symbolVal)
|
(Proxy (..))
|
||||||
import Data.Proxy (Proxy (..))
|
import Data.Typeable
|
||||||
|
(Typeable)
|
||||||
|
import GHC.TypeLits
|
||||||
|
(KnownSymbol, Symbol, symbolVal)
|
||||||
|
|
||||||
-- | Add a short summary for (part of) API.
|
-- | Add a short summary for (part of) API.
|
||||||
--
|
--
|
||||||
|
|
|
@ -2,7 +2,8 @@
|
||||||
{-# OPTIONS_HADDOCK not-home #-}
|
{-# OPTIONS_HADDOCK not-home #-}
|
||||||
module Servant.API.Empty(EmptyAPI(..)) where
|
module Servant.API.Empty(EmptyAPI(..)) where
|
||||||
|
|
||||||
import Data.Typeable (Typeable)
|
import Data.Typeable
|
||||||
|
(Typeable)
|
||||||
import Prelude ()
|
import Prelude ()
|
||||||
import Prelude.Compat
|
import Prelude.Compat
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,11 @@
|
||||||
{-# LANGUAGE DataKinds #-}
|
{-# LANGUAGE DataKinds #-}
|
||||||
{-# LANGUAGE DeriveDataTypeable #-}
|
{-# LANGUAGE DeriveDataTypeable #-}
|
||||||
{-# LANGUAGE KindSignatures #-}
|
{-# LANGUAGE KindSignatures #-}
|
||||||
{-# LANGUAGE PolyKinds #-}
|
{-# LANGUAGE PolyKinds #-}
|
||||||
module Servant.API.Experimental.Auth where
|
module Servant.API.Experimental.Auth where
|
||||||
|
|
||||||
import Data.Typeable (Typeable)
|
import Data.Typeable
|
||||||
|
(Typeable)
|
||||||
|
|
||||||
-- | A generalized Authentication combinator. Use this if you have a
|
-- | A generalized Authentication combinator. Use this if you have a
|
||||||
-- non-standard authentication technique.
|
-- non-standard authentication technique.
|
||||||
|
|
|
@ -6,8 +6,10 @@ module Servant.API.Header (
|
||||||
Header, Header',
|
Header, Header',
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Data.Typeable (Typeable)
|
import Data.Typeable
|
||||||
import GHC.TypeLits (Symbol)
|
(Typeable)
|
||||||
|
import GHC.TypeLits
|
||||||
|
(Symbol)
|
||||||
import Servant.API.Modifiers
|
import Servant.API.Modifiers
|
||||||
|
|
||||||
-- | Extract the given header's value as a value of type @a@.
|
-- | Extract the given header's value as a value of type @a@.
|
||||||
|
|
|
@ -3,7 +3,8 @@ module Servant.API.HttpVersion
|
||||||
HttpVersion(..)
|
HttpVersion(..)
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Network.HTTP.Types (HttpVersion (..))
|
import Network.HTTP.Types
|
||||||
|
(HttpVersion (..))
|
||||||
|
|
||||||
-- $httpversion
|
-- $httpversion
|
||||||
--
|
--
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
{-# LANGUAGE DataKinds #-}
|
{-# LANGUAGE DataKinds #-}
|
||||||
{-# LANGUAGE TypeOperators #-}
|
{-# LANGUAGE TypeOperators #-}
|
||||||
|
|
||||||
-- | This is a module containing an API with all `Servant.API` combinators. It
|
-- | This is a module containing an API with all `Servant.API` combinators. It
|
||||||
|
@ -7,7 +7,6 @@
|
||||||
module Servant.API.Internal.Test.ComprehensiveAPI where
|
module Servant.API.Internal.Test.ComprehensiveAPI where
|
||||||
|
|
||||||
import Data.Proxy
|
import Data.Proxy
|
||||||
|
|
||||||
import Servant.API
|
import Servant.API
|
||||||
|
|
||||||
type GET = Get '[JSON] NoContent
|
type GET = Get '[JSON] NoContent
|
||||||
|
|
|
@ -1,12 +1,14 @@
|
||||||
{-# LANGUAGE DeriveDataTypeable #-}
|
{-# LANGUAGE DeriveDataTypeable #-}
|
||||||
{-# LANGUAGE DeriveGeneric #-}
|
{-# LANGUAGE DeriveGeneric #-}
|
||||||
module Servant.API.IsSecure
|
module Servant.API.IsSecure
|
||||||
( -- $issecure
|
( -- $issecure
|
||||||
IsSecure(..)
|
IsSecure(..)
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Data.Typeable
|
import Data.Typeable
|
||||||
import GHC.Generics (Generic)
|
(Typeable)
|
||||||
|
import GHC.Generics
|
||||||
|
(Generic)
|
||||||
|
|
||||||
-- | Was this request made over an SSL connection?
|
-- | Was this request made over an SSL connection?
|
||||||
--
|
--
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{-# LANGUAGE DataKinds #-}
|
{-# LANGUAGE DataKinds #-}
|
||||||
{-# LANGUAGE KindSignatures #-}
|
|
||||||
{-# LANGUAGE FlexibleContexts #-}
|
{-# LANGUAGE FlexibleContexts #-}
|
||||||
|
{-# LANGUAGE KindSignatures #-}
|
||||||
{-# LANGUAGE ScopedTypeVariables #-}
|
{-# LANGUAGE ScopedTypeVariables #-}
|
||||||
{-# LANGUAGE TypeFamilies #-}
|
{-# LANGUAGE TypeFamilies #-}
|
||||||
{-# LANGUAGE TypeOperators #-}
|
{-# LANGUAGE TypeOperators #-}
|
||||||
|
@ -19,10 +19,14 @@ module Servant.API.Modifiers (
|
||||||
unfoldRequestArgument,
|
unfoldRequestArgument,
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Data.Proxy (Proxy (..))
|
import Data.Proxy
|
||||||
import Data.Singletons.Bool (SBool (..), SBoolI (..))
|
(Proxy (..))
|
||||||
import Data.Text (Text)
|
import Data.Singletons.Bool
|
||||||
import Data.Type.Bool (If)
|
(SBool (..), SBoolI (..))
|
||||||
|
import Data.Text
|
||||||
|
(Text)
|
||||||
|
import Data.Type.Bool
|
||||||
|
(If)
|
||||||
|
|
||||||
-- | Required argument. Not wrapped.
|
-- | Required argument. Not wrapped.
|
||||||
data Required
|
data Required
|
||||||
|
|
|
@ -1,12 +1,14 @@
|
||||||
{-# LANGUAGE DataKinds #-}
|
{-# LANGUAGE DataKinds #-}
|
||||||
{-# LANGUAGE DeriveDataTypeable #-}
|
{-# LANGUAGE DeriveDataTypeable #-}
|
||||||
{-# LANGUAGE TypeOperators #-}
|
|
||||||
{-# LANGUAGE PolyKinds #-}
|
{-# LANGUAGE PolyKinds #-}
|
||||||
|
{-# LANGUAGE TypeOperators #-}
|
||||||
{-# OPTIONS_HADDOCK not-home #-}
|
{-# OPTIONS_HADDOCK not-home #-}
|
||||||
module Servant.API.QueryParam (QueryFlag, QueryParam, QueryParam', QueryParams) where
|
module Servant.API.QueryParam (QueryFlag, QueryParam, QueryParam', QueryParams) where
|
||||||
|
|
||||||
import Data.Typeable (Typeable)
|
import Data.Typeable
|
||||||
import GHC.TypeLits (Symbol)
|
(Typeable)
|
||||||
|
import GHC.TypeLits
|
||||||
|
(Symbol)
|
||||||
import Servant.API.Modifiers
|
import Servant.API.Modifiers
|
||||||
|
|
||||||
-- | Lookup the value associated to the @sym@ query string parameter
|
-- | Lookup the value associated to the @sym@ query string parameter
|
||||||
|
|
|
@ -2,7 +2,9 @@
|
||||||
{-# OPTIONS_HADDOCK not-home #-}
|
{-# OPTIONS_HADDOCK not-home #-}
|
||||||
module Servant.API.Raw where
|
module Servant.API.Raw where
|
||||||
|
|
||||||
import Data.Typeable (Typeable)
|
import Data.Typeable
|
||||||
|
(Typeable)
|
||||||
|
|
||||||
-- | Endpoint for plugging in your own Wai 'Application's.
|
-- | Endpoint for plugging in your own Wai 'Application's.
|
||||||
--
|
--
|
||||||
-- The given 'Application' will get the request as received by the server, potentially with
|
-- The given 'Application' will get the request as received by the server, potentially with
|
||||||
|
|
|
@ -5,6 +5,7 @@ module Servant.API.RemoteHost
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Data.Typeable
|
import Data.Typeable
|
||||||
|
(Typeable)
|
||||||
|
|
||||||
-- | Provides access to the host or IP address
|
-- | Provides access to the host or IP address
|
||||||
-- from which the HTTP request was sent.
|
-- from which the HTTP request was sent.
|
||||||
|
|
|
@ -6,8 +6,9 @@ module Servant.API.ReqBody (
|
||||||
ReqBody, ReqBody',
|
ReqBody, ReqBody',
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Data.Typeable (Typeable)
|
import Data.Typeable
|
||||||
import Servant.API.Modifiers
|
(Typeable)
|
||||||
|
import Servant.API.Modifiers
|
||||||
|
|
||||||
-- | Extract the request body as a value of type @a@.
|
-- | Extract the request body as a value of type @a@.
|
||||||
--
|
--
|
||||||
|
@ -17,7 +18,7 @@ import Servant.API.Modifiers
|
||||||
-- >>> type MyApi = "books" :> ReqBody '[JSON] Book :> Post '[JSON] Book
|
-- >>> type MyApi = "books" :> ReqBody '[JSON] Book :> Post '[JSON] Book
|
||||||
type ReqBody = ReqBody' '[Required, Strict]
|
type ReqBody = ReqBody' '[Required, Strict]
|
||||||
|
|
||||||
-- |
|
-- |
|
||||||
--
|
--
|
||||||
-- /Note:/ 'ReqBody'' is always 'Required'.
|
-- /Note:/ 'ReqBody'' is always 'Required'.
|
||||||
data ReqBody' (mods :: [*]) (contentTypes :: [*]) (a :: *)
|
data ReqBody' (mods :: [*]) (contentTypes :: [*]) (a :: *)
|
||||||
|
|
|
@ -34,18 +34,22 @@ module Servant.API.ResponseHeaders
|
||||||
, HList(..)
|
, HList(..)
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Data.ByteString.Char8 as BS (ByteString, pack, unlines, init)
|
import Data.ByteString.Char8 as BS
|
||||||
import Data.Typeable (Typeable)
|
(ByteString, init, pack, unlines)
|
||||||
import Web.HttpApiData (ToHttpApiData, toHeader,
|
import qualified Data.CaseInsensitive as CI
|
||||||
FromHttpApiData, parseHeader)
|
|
||||||
import qualified Data.CaseInsensitive as CI
|
|
||||||
import Data.Proxy
|
import Data.Proxy
|
||||||
import GHC.TypeLits (KnownSymbol, Symbol, symbolVal)
|
import Data.Typeable
|
||||||
import qualified Network.HTTP.Types.Header as HTTP
|
(Typeable)
|
||||||
|
import GHC.TypeLits
|
||||||
|
(KnownSymbol, Symbol, symbolVal)
|
||||||
|
import qualified Network.HTTP.Types.Header as HTTP
|
||||||
|
import Web.HttpApiData
|
||||||
|
(FromHttpApiData, ToHttpApiData, parseHeader, toHeader)
|
||||||
|
|
||||||
import Servant.API.Header (Header)
|
import Prelude ()
|
||||||
import Prelude ()
|
|
||||||
import Prelude.Compat
|
import Prelude.Compat
|
||||||
|
import Servant.API.Header
|
||||||
|
(Header)
|
||||||
|
|
||||||
-- | Response Header objects. You should never need to construct one directly.
|
-- | Response Header objects. You should never need to construct one directly.
|
||||||
-- Instead, use 'addOptionalHeader'.
|
-- Instead, use 'addOptionalHeader'.
|
||||||
|
|
|
@ -1,26 +1,34 @@
|
||||||
{-# LANGUAGE DataKinds #-}
|
{-# LANGUAGE DataKinds #-}
|
||||||
{-# LANGUAGE DeriveDataTypeable #-}
|
{-# LANGUAGE DeriveDataTypeable #-}
|
||||||
{-# LANGUAGE DeriveGeneric #-}
|
{-# LANGUAGE DeriveGeneric #-}
|
||||||
{-# LANGUAGE FlexibleInstances #-}
|
{-# LANGUAGE FlexibleInstances #-}
|
||||||
{-# LANGUAGE KindSignatures #-}
|
{-# LANGUAGE KindSignatures #-}
|
||||||
{-# LANGUAGE MultiParamTypeClasses #-}
|
{-# LANGUAGE MultiParamTypeClasses #-}
|
||||||
{-# LANGUAGE OverloadedStrings #-}
|
{-# LANGUAGE OverloadedStrings #-}
|
||||||
{-# LANGUAGE PolyKinds #-}
|
{-# LANGUAGE PolyKinds #-}
|
||||||
{-# LANGUAGE RankNTypes #-}
|
{-# LANGUAGE RankNTypes #-}
|
||||||
{-# LANGUAGE TupleSections #-}
|
{-# LANGUAGE TupleSections #-}
|
||||||
{-# OPTIONS_HADDOCK not-home #-}
|
{-# OPTIONS_HADDOCK not-home #-}
|
||||||
|
|
||||||
module Servant.API.Stream where
|
module Servant.API.Stream where
|
||||||
|
|
||||||
import Data.ByteString.Lazy (ByteString, empty)
|
import Control.Arrow
|
||||||
import qualified Data.ByteString.Lazy.Char8 as LB
|
(first)
|
||||||
import Data.Monoid ((<>))
|
import Data.ByteString.Lazy
|
||||||
import Data.Proxy (Proxy)
|
(ByteString, empty)
|
||||||
import Data.Typeable (Typeable)
|
import qualified Data.ByteString.Lazy.Char8 as LB
|
||||||
import GHC.Generics (Generic)
|
import Data.Monoid
|
||||||
import Text.Read (readMaybe)
|
((<>))
|
||||||
import Control.Arrow (first)
|
import Data.Proxy
|
||||||
import Network.HTTP.Types.Method (StdMethod (..))
|
(Proxy)
|
||||||
|
import Data.Typeable
|
||||||
|
(Typeable)
|
||||||
|
import GHC.Generics
|
||||||
|
(Generic)
|
||||||
|
import Network.HTTP.Types.Method
|
||||||
|
(StdMethod (..))
|
||||||
|
import Text.Read
|
||||||
|
(readMaybe)
|
||||||
|
|
||||||
-- | A Stream endpoint for a given method emits a stream of encoded values at a given Content-Type, delimited by a framing strategy. Steam endpoints always return response code 200 on success. Type synonyms are provided for standard methods.
|
-- | A Stream endpoint for a given method emits a stream of encoded values at a given Content-Type, delimited by a framing strategy. Steam endpoints always return response code 200 on success. Type synonyms are provided for standard methods.
|
||||||
data Stream (method :: k1) (framing :: *) (contentType :: *) (a :: *)
|
data Stream (method :: k1) (framing :: *) (contentType :: *) (a :: *)
|
||||||
|
|
|
@ -4,7 +4,8 @@
|
||||||
{-# OPTIONS_HADDOCK not-home #-}
|
{-# OPTIONS_HADDOCK not-home #-}
|
||||||
module Servant.API.Sub ((:>)) where
|
module Servant.API.Sub ((:>)) where
|
||||||
|
|
||||||
import Data.Typeable (Typeable)
|
import Data.Typeable
|
||||||
|
(Typeable)
|
||||||
|
|
||||||
-- | The contained API (second argument) can be found under @("/" ++ path)@
|
-- | The contained API (second argument) can be found under @("/" ++ path)@
|
||||||
-- (path being the first argument).
|
-- (path being the first argument).
|
||||||
|
|
|
@ -47,16 +47,25 @@ module Servant.API.TypeLevel (
|
||||||
) where
|
) where
|
||||||
|
|
||||||
|
|
||||||
import GHC.Exts (Constraint)
|
import GHC.Exts
|
||||||
import Servant.API.Alternative (type (:<|>))
|
(Constraint)
|
||||||
import Servant.API.Capture (Capture, CaptureAll)
|
import Servant.API.Alternative
|
||||||
import Servant.API.Header (Header)
|
(type (:<|>))
|
||||||
import Servant.API.QueryParam (QueryFlag, QueryParam, QueryParams)
|
import Servant.API.Capture
|
||||||
import Servant.API.ReqBody (ReqBody)
|
(Capture, CaptureAll)
|
||||||
import Servant.API.Sub (type (:>))
|
import Servant.API.Header
|
||||||
import Servant.API.Verbs (Verb)
|
(Header)
|
||||||
|
import Servant.API.QueryParam
|
||||||
|
(QueryFlag, QueryParam, QueryParams)
|
||||||
|
import Servant.API.ReqBody
|
||||||
|
(ReqBody)
|
||||||
|
import Servant.API.Sub
|
||||||
|
(type (:>))
|
||||||
|
import Servant.API.Verbs
|
||||||
|
(Verb)
|
||||||
#if MIN_VERSION_base(4,9,0)
|
#if MIN_VERSION_base(4,9,0)
|
||||||
import GHC.TypeLits (TypeError, ErrorMessage(..))
|
import GHC.TypeLits
|
||||||
|
(ErrorMessage (..), TypeError)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -3,7 +3,8 @@ module Servant.API.Vault
|
||||||
Vault
|
Vault
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Data.Vault.Lazy (Vault)
|
import Data.Vault.Lazy
|
||||||
|
(Vault)
|
||||||
|
|
||||||
-- $vault
|
-- $vault
|
||||||
--
|
--
|
||||||
|
|
|
@ -8,15 +8,18 @@ module Servant.API.Verbs
|
||||||
, StdMethod(GET, POST, HEAD, PUT, DELETE, TRACE, CONNECT, OPTIONS, PATCH)
|
, StdMethod(GET, POST, HEAD, PUT, DELETE, TRACE, CONNECT, OPTIONS, PATCH)
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Data.Typeable (Typeable)
|
import Data.Proxy
|
||||||
import Data.Proxy (Proxy)
|
(Proxy)
|
||||||
import GHC.Generics (Generic)
|
import Data.Typeable
|
||||||
import GHC.TypeLits (Nat)
|
(Typeable)
|
||||||
import Network.HTTP.Types.Method (Method, StdMethod (..),
|
import GHC.Generics
|
||||||
methodDelete, methodGet, methodHead,
|
(Generic)
|
||||||
methodPatch, methodPost, methodPut,
|
import GHC.TypeLits
|
||||||
methodTrace, methodConnect,
|
(Nat)
|
||||||
methodOptions)
|
import Network.HTTP.Types.Method
|
||||||
|
(Method, StdMethod (..), methodConnect, methodDelete,
|
||||||
|
methodGet, methodHead, methodOptions, methodPatch, methodPost,
|
||||||
|
methodPut, methodTrace)
|
||||||
|
|
||||||
-- | @Verb@ is a general type for representing HTTP verbs (a.k.a. methods). For
|
-- | @Verb@ is a general type for representing HTTP verbs (a.k.a. methods). For
|
||||||
-- convenience, type synonyms for each verb with a 200 response code are
|
-- convenience, type synonyms for each verb with a 200 response code are
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
{-# LANGUAGE DataKinds #-}
|
{-# LANGUAGE DataKinds #-}
|
||||||
{-# LANGUAGE KindSignatures #-}
|
{-# LANGUAGE KindSignatures #-}
|
||||||
|
|
||||||
module Servant.API.WithNamedContext where
|
module Servant.API.WithNamedContext where
|
||||||
|
|
||||||
import GHC.TypeLits
|
import GHC.TypeLits
|
||||||
|
|
||||||
-- | 'WithNamedContext' names a specific tagged context to use for the
|
-- | 'WithNamedContext' names a specific tagged context to use for the
|
||||||
-- combinators in the API. (See also in @servant-server@,
|
-- combinators in the API. (See also in @servant-server@,
|
||||||
|
|
|
@ -13,7 +13,6 @@ module Servant.Utils.Enter {-# DEPRECATED "Use hoistServer or hoistServerWithCon
|
||||||
(:~>)(..),
|
(:~>)(..),
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Control.Natural
|
|
||||||
import Control.Monad.Identity
|
import Control.Monad.Identity
|
||||||
import Control.Monad.Morph
|
import Control.Monad.Morph
|
||||||
import Control.Monad.Reader
|
import Control.Monad.Reader
|
||||||
|
@ -21,8 +20,10 @@ import qualified Control.Monad.State.Lazy as LState
|
||||||
import qualified Control.Monad.State.Strict as SState
|
import qualified Control.Monad.State.Strict as SState
|
||||||
import qualified Control.Monad.Writer.Lazy as LWriter
|
import qualified Control.Monad.Writer.Lazy as LWriter
|
||||||
import qualified Control.Monad.Writer.Strict as SWriter
|
import qualified Control.Monad.Writer.Strict as SWriter
|
||||||
import Data.Tagged (Tagged, retag)
|
import Control.Natural
|
||||||
import Prelude ()
|
import Data.Tagged
|
||||||
|
(Tagged, retag)
|
||||||
|
import Prelude ()
|
||||||
import Prelude.Compat
|
import Prelude.Compat
|
||||||
import Servant.API
|
import Servant.API
|
||||||
|
|
||||||
|
|
|
@ -101,38 +101,63 @@ module Servant.Utils.Links (
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import Data.List
|
import Data.List
|
||||||
import Data.Monoid.Compat ( (<>) )
|
import Data.Monoid.Compat
|
||||||
import Data.Proxy ( Proxy(..) )
|
((<>))
|
||||||
import Data.Singletons.Bool ( SBool (..), SBoolI (..) )
|
import Data.Proxy
|
||||||
import qualified Data.Text as Text
|
(Proxy (..))
|
||||||
import qualified Data.Text.Encoding as TE
|
import Data.Singletons.Bool
|
||||||
import Data.Type.Bool (If)
|
(SBool (..), SBoolI (..))
|
||||||
import GHC.TypeLits ( KnownSymbol, symbolVal )
|
import qualified Data.Text as Text
|
||||||
import Network.URI ( URI(..), escapeURIString, isUnreserved )
|
import qualified Data.Text.Encoding as TE
|
||||||
import Prelude ()
|
import Data.Type.Bool
|
||||||
|
(If)
|
||||||
|
import GHC.TypeLits
|
||||||
|
(KnownSymbol, symbolVal)
|
||||||
|
import Network.URI
|
||||||
|
(URI (..), escapeURIString, isUnreserved)
|
||||||
|
import Prelude ()
|
||||||
import Prelude.Compat
|
import Prelude.Compat
|
||||||
|
|
||||||
import Web.HttpApiData
|
import Servant.API.Alternative
|
||||||
import Servant.API.Alternative ( (:<|>)((:<|>)) )
|
((:<|>) ((:<|>)))
|
||||||
import Servant.API.BasicAuth ( BasicAuth )
|
import Servant.API.BasicAuth
|
||||||
import Servant.API.Capture ( Capture', CaptureAll )
|
(BasicAuth)
|
||||||
import Servant.API.ReqBody ( ReqBody' )
|
import Servant.API.Capture
|
||||||
import Servant.API.QueryParam ( QueryParam', QueryParams, QueryFlag )
|
(Capture', CaptureAll)
|
||||||
import Servant.API.Header ( Header' )
|
import Servant.API.Description
|
||||||
import Servant.API.HttpVersion (HttpVersion)
|
(Description, Summary)
|
||||||
import Servant.API.RemoteHost ( RemoteHost )
|
import Servant.API.Empty
|
||||||
import Servant.API.IsSecure (IsSecure)
|
(EmptyAPI (..))
|
||||||
import Servant.API.Empty (EmptyAPI (..))
|
import Servant.API.Experimental.Auth
|
||||||
import Servant.API.Verbs ( Verb )
|
(AuthProtect)
|
||||||
import Servant.API.Sub ( type (:>) )
|
import Servant.API.Header
|
||||||
import Servant.API.Raw ( Raw )
|
(Header')
|
||||||
import Servant.API.Stream ( Stream )
|
import Servant.API.HttpVersion
|
||||||
import Servant.API.TypeLevel
|
(HttpVersion)
|
||||||
import Servant.API.Modifiers (FoldRequired)
|
import Servant.API.IsSecure
|
||||||
import Servant.API.Description (Description, Summary)
|
(IsSecure)
|
||||||
import Servant.API.Vault (Vault)
|
import Servant.API.Modifiers
|
||||||
import Servant.API.WithNamedContext (WithNamedContext)
|
(FoldRequired)
|
||||||
import Servant.API.Experimental.Auth ( AuthProtect )
|
import Servant.API.QueryParam
|
||||||
|
(QueryFlag, QueryParam', QueryParams)
|
||||||
|
import Servant.API.Raw
|
||||||
|
(Raw)
|
||||||
|
import Servant.API.RemoteHost
|
||||||
|
(RemoteHost)
|
||||||
|
import Servant.API.ReqBody
|
||||||
|
(ReqBody')
|
||||||
|
import Servant.API.Stream
|
||||||
|
(Stream)
|
||||||
|
import Servant.API.Sub
|
||||||
|
(type (:>))
|
||||||
|
import Servant.API.TypeLevel
|
||||||
|
import Servant.API.Vault
|
||||||
|
(Vault)
|
||||||
|
import Servant.API.Verbs
|
||||||
|
(Verb)
|
||||||
|
import Servant.API.WithNamedContext
|
||||||
|
(WithNamedContext)
|
||||||
|
import Web.HttpApiData
|
||||||
|
|
||||||
-- | A safe link datatype.
|
-- | A safe link datatype.
|
||||||
-- The only way of constructing a 'Link' is using 'safeLink', which means any
|
-- The only way of constructing a 'Link' is using 'safeLink', which means any
|
||||||
|
|
Loading…
Add table
Reference in a new issue