servant-router-0.9.0: Servant router for non-server applications.

Safe HaskellNone
LanguageHaskell2010

Servant.Router

Synopsis

Documentation

data View Source #

Router terminator. The HasRouter instance for View finalizes the router.

Example:

type MyApi = "books" :> Capture "bookId" Int :> View

Instances

HasRouter * View Source # 

Associated Types

type RouteT View (layout :: View) (m :: * -> *) a :: * Source #

Methods

constHandler :: Monad m => Proxy View layout -> Proxy (* -> *) m -> a -> RouteT View layout m a Source #

route :: Proxy View layout -> Proxy (* -> *) m -> Proxy * a -> RouteT View layout m a -> Router * m a Source #

routeConst :: Monad m => Proxy View layout -> Proxy (* -> *) m -> a -> Router * m a Source #

type RouteT * View m a Source # 
type RouteT * View m a = m a

data Location Source #

Location is used to split the path and query of a URI into components.

Constructors

Location 

Fields

data RoutingError Source #

When routing, the router may fail to match a location. Either this is an unrecoverable failure, such as failing to parse a query parameter, or it is recoverable by trying another path.

Constructors

Fail 
FailFatal 

data Router m a where Source #

A Router contains the information necessary to execute a handler.

Constructors

RChoice :: Router m a -> Router m a -> Router m a 
RCapture :: FromHttpApiData x => (x -> Router m a) -> Router m a 
RQueryParam :: (FromHttpApiData x, KnownSymbol sym) => Proxy sym -> (Maybe x -> Router m a) -> Router m a 
RQueryParams :: (FromHttpApiData x, KnownSymbol sym) => Proxy sym -> ([x] -> Router m a) -> Router m a 
RQueryFlag :: KnownSymbol sym => Proxy sym -> (Bool -> Router m a) -> Router m a 
RPath :: KnownSymbol sym => Proxy sym -> Router m a -> Router m a 
RPage :: m a -> Router m a 

type family ViewTransform layout view where ... Source #

Transform a layout by replacing View with another type

Equations

ViewTransform (a :<|> b) view = ViewTransform a view :<|> ViewTransform b view 
ViewTransform (a :> b) view = a :> ViewTransform b view 
ViewTransform View view = view 

class HasRouter layout where Source #

This is similar to the HasServer class from servant-server. It is the class responsible for making API combinators routable. RuoteT is used to build up the handler types. Router is returned, to be interpretted by routeLoc.

Minimal complete definition

constHandler, route

Associated Types

type RouteT layout (m :: * -> *) a :: * Source #

A route handler.

Methods

constHandler :: Monad m => Proxy layout -> Proxy m -> a -> RouteT layout m a Source #

Create a constant route handler that returns a

route :: Proxy layout -> Proxy m -> Proxy a -> RouteT layout m a -> Router m a Source #

Transform a route handler into a Router.

routeConst :: Monad m => Proxy layout -> Proxy m -> a -> Router m a Source #

Create a Router from a constant.

Instances

HasRouter * View Source # 

Associated Types

type RouteT View (layout :: View) (m :: * -> *) a :: * Source #

Methods

constHandler :: Monad m => Proxy View layout -> Proxy (* -> *) m -> a -> RouteT View layout m a Source #

route :: Proxy View layout -> Proxy (* -> *) m -> Proxy * a -> RouteT View layout m a -> Router * m a Source #

routeConst :: Monad m => Proxy View layout -> Proxy (* -> *) m -> a -> Router * m a Source #

(HasRouter * x, HasRouter * y) => HasRouter * ((:<|>) x y) Source # 

Associated Types

type RouteT ((:<|>) x y) (layout :: (:<|>) x y) (m :: * -> *) a :: * Source #

Methods

constHandler :: Monad m => Proxy (x :<|> y) layout -> Proxy (* -> *) m -> a -> RouteT (x :<|> y) layout m a Source #

route :: Proxy (x :<|> y) layout -> Proxy (* -> *) m -> Proxy * a -> RouteT (x :<|> y) layout m a -> Router * m a Source #

routeConst :: Monad m => Proxy (x :<|> y) layout -> Proxy (* -> *) m -> a -> Router * m a Source #

(HasRouter k1 sublayout, KnownSymbol sym) => HasRouter * ((:>) * k1 (QueryFlag sym) sublayout) Source # 

Associated Types

type RouteT ((:>) * k1 (QueryFlag sym) sublayout) (layout :: (:>) * k1 (QueryFlag sym) sublayout) (m :: * -> *) a :: * Source #

Methods

constHandler :: Monad m => Proxy ((* :> k1) (QueryFlag sym) sublayout) layout -> Proxy (* -> *) m -> a -> RouteT ((* :> k1) (QueryFlag sym) sublayout) layout m a Source #

route :: Proxy ((* :> k1) (QueryFlag sym) sublayout) layout -> Proxy (* -> *) m -> Proxy * a -> RouteT ((* :> k1) (QueryFlag sym) sublayout) layout m a -> Router * m a Source #

routeConst :: Monad m => Proxy ((* :> k1) (QueryFlag sym) sublayout) layout -> Proxy (* -> *) m -> a -> Router * m a Source #

(HasRouter k1 sublayout, FromHttpApiData x, KnownSymbol sym) => HasRouter * ((:>) * k1 (QueryParams * sym x) sublayout) Source # 

Associated Types

type RouteT ((:>) * k1 (QueryParams * sym x) sublayout) (layout :: (:>) * k1 (QueryParams * sym x) sublayout) (m :: * -> *) a :: * Source #

Methods

constHandler :: Monad m => Proxy ((* :> k1) (QueryParams * sym x) sublayout) layout -> Proxy (* -> *) m -> a -> RouteT ((* :> k1) (QueryParams * sym x) sublayout) layout m a Source #

route :: Proxy ((* :> k1) (QueryParams * sym x) sublayout) layout -> Proxy (* -> *) m -> Proxy * a -> RouteT ((* :> k1) (QueryParams * sym x) sublayout) layout m a -> Router * m a Source #

routeConst :: Monad m => Proxy ((* :> k1) (QueryParams * sym x) sublayout) layout -> Proxy (* -> *) m -> a -> Router * m a Source #

(HasRouter k1 sublayout, FromHttpApiData x, KnownSymbol sym) => HasRouter * ((:>) * k1 (QueryParam * sym x) sublayout) Source # 

Associated Types

type RouteT ((:>) * k1 (QueryParam * sym x) sublayout) (layout :: (:>) * k1 (QueryParam * sym x) sublayout) (m :: * -> *) a :: * Source #

Methods

constHandler :: Monad m => Proxy ((* :> k1) (QueryParam * sym x) sublayout) layout -> Proxy (* -> *) m -> a -> RouteT ((* :> k1) (QueryParam * sym x) sublayout) layout m a Source #

route :: Proxy ((* :> k1) (QueryParam * sym x) sublayout) layout -> Proxy (* -> *) m -> Proxy * a -> RouteT ((* :> k1) (QueryParam * sym x) sublayout) layout m a -> Router * m a Source #

routeConst :: Monad m => Proxy ((* :> k1) (QueryParam * sym x) sublayout) layout -> Proxy (* -> *) m -> a -> Router * m a Source #

(HasRouter k1 sublayout, FromHttpApiData x) => HasRouter * ((:>) * k1 (Capture * sym x) sublayout) Source # 

Associated Types

type RouteT ((:>) * k1 (Capture * sym x) sublayout) (layout :: (:>) * k1 (Capture * sym x) sublayout) (m :: * -> *) a :: * Source #

Methods

constHandler :: Monad m => Proxy ((* :> k1) (Capture * sym x) sublayout) layout -> Proxy (* -> *) m -> a -> RouteT ((* :> k1) (Capture * sym x) sublayout) layout m a Source #

route :: Proxy ((* :> k1) (Capture * sym x) sublayout) layout -> Proxy (* -> *) m -> Proxy * a -> RouteT ((* :> k1) (Capture * sym x) sublayout) layout m a -> Router * m a Source #

routeConst :: Monad m => Proxy ((* :> k1) (Capture * sym x) sublayout) layout -> Proxy (* -> *) m -> a -> Router * m a Source #

(HasRouter k1 sublayout, KnownSymbol path) => HasRouter * ((:>) Symbol k1 path sublayout) Source # 

Associated Types

type RouteT ((:>) Symbol k1 path sublayout) (layout :: (:>) Symbol k1 path sublayout) (m :: * -> *) a :: * Source #

Methods

constHandler :: Monad m => Proxy ((Symbol :> k1) path sublayout) layout -> Proxy (* -> *) m -> a -> RouteT ((Symbol :> k1) path sublayout) layout m a Source #

route :: Proxy ((Symbol :> k1) path sublayout) layout -> Proxy (* -> *) m -> Proxy * a -> RouteT ((Symbol :> k1) path sublayout) layout m a -> Router * m a Source #

routeConst :: Monad m => Proxy ((Symbol :> k1) path sublayout) layout -> Proxy (* -> *) m -> a -> Router * m a Source #

runRouteLoc :: forall layout m a. (HasRouter layout, Monad m) => Location -> Proxy layout -> RouteT layout m a -> m (Either RoutingError a) Source #

Use a handler to route a Location. Normally runRoute should be used instead, unless you want custom handling of string failing to parse as URI.

runRoute :: forall layout m a. (HasRouter layout, Monad m) => String -> Proxy layout -> RouteT layout m a -> m (Either RoutingError a) Source #

Use a handler to route a location, represented as a String. All handlers must, in the end, return m a. routeLoc will choose a route and return its result.

routeLoc :: Monad m => Location -> Router m a -> m (Either RoutingError a) Source #

Use a computed Router to route a Location.