Safe Haskell | None |
---|---|
Language | Haskell2010 |
Synopsis
- data SortingParams (provided :: [TyNamedParam *]) (base :: [TyNamedParam (SortingOrderType *)])
- type SortParamsExpanded allowed subApi = QueryParam "sortBy" (TaggedSortingItemsList allowed) :> subApi
- data SortingSpec (provided :: [TyNamedParam *]) (base :: [TyNamedParam (SortingOrderType *)]) = ReifySortingItems base => SortingSpec {
- ssProvided :: [SortingItem]
- ssBase :: forall base provided. SortingSpec provided base -> [SortingItem]
- ssAll :: SortingSpec provided base -> [SortingItem]
- data SortingOrder
- data NullsSortingOrder
- newtype SortingItemTagged (provided :: TyNamedParam *) = SortingItemTagged {}
- data SortingItem = SortingItem {
- siName :: Text
- siOrder :: SortingOrder
- type TaggedSortingItemsList provided = Tagged (provided :: [TyNamedParam *]) [SortingItem]
- data SortingOrderType k
- class ReifySortingItems (items :: [TyNamedParam (SortingOrderType *)]) where
- type family BaseSortingToParam (base :: [TyNamedParam (SortingOrderType *)]) :: [TyNamedParam *] where ...
- type family AllSortingParams (provided :: [TyNamedParam *]) (base :: [TyNamedParam (SortingOrderType *)]) :: [TyNamedParam *] where ...
- type family SortingParamProvidedOf a :: [TyNamedParam *]
- type family SortingParamBaseOf a :: [TyNamedParam (SortingOrderType *)]
- type SortingParamsOf a = SortingParams (SortingParamProvidedOf a) (SortingParamBaseOf a)
- type SortingSpecOf a = SortingSpec (SortingParamProvidedOf a) (SortingParamBaseOf a)
Documentation
data SortingParams (provided :: [TyNamedParam *]) (base :: [TyNamedParam (SortingOrderType *)]) Source #
Servant API combinator which allows to accept sorting parameters as a query parameter.
Example: with the following combinator
SortingParams ["time" ?: Timestamp, "name" ?: Text] '[]
the endpoint can parse "sortBy=-time,+name" or "sortBy=desc(time),asc(name)" formats, which would mean sorting by mentioned fields lexicographically. All sorting subparameters are optional, as well as entire "sortBy" parameter.
The second type-level list stands for the base sorting order, it will be applied in the end disregard the user's input. It is highly recommended to specify the base sorting that unambigously orders the result(for example - by the primary key of the database), otherwise pagination may behave unexpectedly for the client when it specifies no sorting.
If you want the base sorting order to be overridable by the user, you can put the respective fields in both lists. For example, this combinator:
SortingParams '["time" ?: Timestamp] ["id" ?: '(Id, 'Descendant), "time" ?: '(Timestamp, 'Ascendant)]
will sort results lexicographically by (Down id, time)
, but if the client
specifies sorting by time, you will get sorting by (time, Down id)
as the
trailing "time"
will not affect anything.
It is preferred to put a base sorting at least by ID
, this way results will be
more deterministic.
Your handler will be provided with SortingSpec
argument which can later be passed
in an appropriate function to perform sorting.
Instances
HasClient m subApi => HasClient m (SortingParams provided base :> subApi) Source # | |
Defined in Servant.Util.Combinators.Sorting.Client type Client m (SortingParams provided base :> subApi) # clientWithRoute :: Proxy m -> Proxy (SortingParams provided base :> subApi) -> Request -> Client m (SortingParams provided base :> subApi) # hoistClientMonad :: Proxy m -> Proxy (SortingParams provided base :> subApi) -> (forall x. mon x -> mon' x) -> Client mon (SortingParams provided base :> subApi) -> Client mon' (SortingParams provided base :> subApi) # | |
(HasLoggingServer config lcontext subApi ctx, HasContextEntry (ctx .++ DefaultErrorFormatters) ErrorFormatters, ReifySortingItems base, ReifyParamsNames provided) => HasLoggingServer (config :: Type) lcontext (SortingParams provided base :> subApi :: Type) ctx Source # | |
Defined in Servant.Util.Combinators.Sorting.Logging routeWithLog :: Proxy (LoggingApiRec config lcontext (SortingParams provided base :> subApi)) -> Context ctx -> Delayed env (Server (LoggingApiRec config lcontext (SortingParams provided base :> subApi))) -> Router env Source # | |
(HasSwagger api, ReifySortingItems base, ReifyParamsNames provided) => HasSwagger (SortingParams provided base :> api :: Type) Source # | |
Defined in Servant.Util.Combinators.Sorting.Swagger | |
(HasServer subApi ctx, HasContextEntry (ctx .++ DefaultErrorFormatters) ErrorFormatters, ReifySortingItems base, ReifyParamsNames provided) => HasServer (SortingParams provided base :> subApi :: Type) ctx Source # | Consumes "sortBy" query parameter and fetches sorting parameters contained in it. |
Defined in Servant.Util.Combinators.Sorting.Server type ServerT (SortingParams provided base :> subApi) m # route :: Proxy (SortingParams provided base :> subApi) -> Context ctx -> Delayed env (Server (SortingParams provided base :> subApi)) -> Router env # hoistServerWithContext :: Proxy (SortingParams provided base :> subApi) -> Proxy ctx -> (forall x. m x -> n x) -> ServerT (SortingParams provided base :> subApi) m -> ServerT (SortingParams provided base :> subApi) n # | |
type Client m (SortingParams provided base :> subApi) Source # | |
Defined in Servant.Util.Combinators.Sorting.Client type Client m (SortingParams provided base :> subApi) = SortingSpec provided base -> Client m subApi | |
type ServerT (SortingParams provided base :> subApi :: Type) m Source # | |
Defined in Servant.Util.Combinators.Sorting.Server type ServerT (SortingParams provided base :> subApi :: Type) m = SortingSpec provided base -> ServerT subApi m |
type SortParamsExpanded allowed subApi = QueryParam "sortBy" (TaggedSortingItemsList allowed) :> subApi Source #
How servant sees SortParams
under the hood.
data SortingSpec (provided :: [TyNamedParam *]) (base :: [TyNamedParam (SortingOrderType *)]) Source #
What is passed to an endpoint, contains all sorting parameters provided by a user.
ReifySortingItems base => SortingSpec | |
|
Instances
ssBase :: forall base provided. SortingSpec provided base -> [SortingItem] Source #
Base sorting items, that are present disregard the client's input (lexicographical order).
This is a sort of virtual field, so such naming.
ssAll :: SortingSpec provided base -> [SortingItem] Source #
All sorting items with duplicates removed (lexicographical order).
data SortingOrder Source #
Order of sorting.
Instances
Enum SortingOrder Source # | |
Defined in Servant.Util.Combinators.Sorting.Base succ :: SortingOrder -> SortingOrder # pred :: SortingOrder -> SortingOrder # toEnum :: Int -> SortingOrder # fromEnum :: SortingOrder -> Int # enumFrom :: SortingOrder -> [SortingOrder] # enumFromThen :: SortingOrder -> SortingOrder -> [SortingOrder] # enumFromTo :: SortingOrder -> SortingOrder -> [SortingOrder] # enumFromThenTo :: SortingOrder -> SortingOrder -> SortingOrder -> [SortingOrder] # | |
Eq SortingOrder Source # | |
Defined in Servant.Util.Combinators.Sorting.Base (==) :: SortingOrder -> SortingOrder -> Bool # (/=) :: SortingOrder -> SortingOrder -> Bool # | |
Show SortingOrder Source # | |
Defined in Servant.Util.Combinators.Sorting.Base showsPrec :: Int -> SortingOrder -> ShowS # show :: SortingOrder -> String # showList :: [SortingOrder] -> ShowS # | |
Arbitrary SortingOrder Source # | |
Defined in Servant.Util.Combinators.Sorting.Arbitrary arbitrary :: Gen SortingOrder # shrink :: SortingOrder -> [SortingOrder] # |
data NullsSortingOrder Source #
Where to place null fields.
Instances
Enum NullsSortingOrder Source # | |
Defined in Servant.Util.Combinators.Sorting.Base succ :: NullsSortingOrder -> NullsSortingOrder # pred :: NullsSortingOrder -> NullsSortingOrder # toEnum :: Int -> NullsSortingOrder # fromEnum :: NullsSortingOrder -> Int # enumFrom :: NullsSortingOrder -> [NullsSortingOrder] # enumFromThen :: NullsSortingOrder -> NullsSortingOrder -> [NullsSortingOrder] # enumFromTo :: NullsSortingOrder -> NullsSortingOrder -> [NullsSortingOrder] # enumFromThenTo :: NullsSortingOrder -> NullsSortingOrder -> NullsSortingOrder -> [NullsSortingOrder] # | |
Eq NullsSortingOrder Source # | |
Defined in Servant.Util.Combinators.Sorting.Base (==) :: NullsSortingOrder -> NullsSortingOrder -> Bool # (/=) :: NullsSortingOrder -> NullsSortingOrder -> Bool # | |
Show NullsSortingOrder Source # | |
Defined in Servant.Util.Combinators.Sorting.Base showsPrec :: Int -> NullsSortingOrder -> ShowS # show :: NullsSortingOrder -> String # showList :: [NullsSortingOrder] -> ShowS # |
newtype SortingItemTagged (provided :: TyNamedParam *) Source #
Version SortingItem
which remembers its name and parameter type at type level.
In functions which belong to public API you will most probably want to use this datatype
as a safer variant of SortingItem
.
Instances
Show (SortingItemTagged provided) Source # | |
Defined in Servant.Util.Combinators.Sorting.Base showsPrec :: Int -> SortingItemTagged provided -> ShowS # show :: SortingItemTagged provided -> String # showList :: [SortingItemTagged provided] -> ShowS # | |
Buildable (SortingItemTagged param) Source # | |
Defined in Servant.Util.Combinators.Sorting.Base build :: SortingItemTagged param -> Builder # |
data SortingItem Source #
For a given field, user-supplied order of sorting.
This type is primarly for internal use, see also SortingItemTagged
.
SortingItem | |
|
Instances
type TaggedSortingItemsList provided = Tagged (provided :: [TyNamedParam *]) [SortingItem] Source #
Tagged, because we want to retain list of allowed fields for parsing
(in instance FromHttpApiData
).
data SortingOrderType k Source #
Order of sorting for type-level.
Its constructors accept the type of thing we order by, e.g. Asc Id
.
Instances
ReifySortingItems ('[] :: [TyNamedParam (SortingOrderType Type)]) Source # | |
Defined in Servant.Util.Combinators.Sorting.Base | |
(ReifySortingOrder order, KnownSymbol name, ReifySortingItems items) => ReifySortingItems ('TyNamedParam name (order field) ': items) Source # | |
Defined in Servant.Util.Combinators.Sorting.Base |
class ReifySortingItems (items :: [TyNamedParam (SortingOrderType *)]) where Source #
Requires given type-level items to be valid specification of sorting.
Instances
ReifySortingItems ('[] :: [TyNamedParam (SortingOrderType Type)]) Source # | |
Defined in Servant.Util.Combinators.Sorting.Base | |
(ReifySortingOrder order, KnownSymbol name, ReifySortingItems items) => ReifySortingItems ('TyNamedParam name (order field) ': items) Source # | |
Defined in Servant.Util.Combinators.Sorting.Base |
type family BaseSortingToParam (base :: [TyNamedParam (SortingOrderType *)]) :: [TyNamedParam *] where ... Source #
Maps base
params to the form common for provided
and base
.
BaseSortingToParam '[] = '[] | |
BaseSortingToParam ('TyNamedParam name (order field) ': xs) = 'TyNamedParam name field ': BaseSortingToParam xs |
type family AllSortingParams (provided :: [TyNamedParam *]) (base :: [TyNamedParam (SortingOrderType *)]) :: [TyNamedParam *] where ... Source #
All sorting params, provided + base.
This does not yet remove duplicates from provided
and base
sets,
we wait for specific use cases to decide how to handle this better.
AllSortingParams provided base = provided ++ BaseSortingToParam base |
type family SortingParamProvidedOf a :: [TyNamedParam *] Source #
For a given return type of an endpoint get corresponding sorting params that can be specified by user. This mapping is sensible, since we usually allow to sort only on fields appearing in endpoint's response.
Instances
type SortingParamProvidedOf NoContent Source # | |
Defined in Servant.Util.Combinators.Sorting.Base |
type family SortingParamBaseOf a :: [TyNamedParam (SortingOrderType *)] Source #
For a given return type of an endpoint get corresponding base sorting params.
Instances
type SortingParamBaseOf NoContent Source # | |
Defined in Servant.Util.Combinators.Sorting.Base |
type SortingParamsOf a = SortingParams (SortingParamProvidedOf a) (SortingParamBaseOf a) Source #
This you will most probably want to specify in API.
type SortingSpecOf a = SortingSpec (SortingParamProvidedOf a) (SortingParamBaseOf a) Source #
This you will most probably want to specify in an endpoint implementation.