core-webserver-servant 0.1.0.0 → 0.1.1.0
raw patch · 2 files changed
+38/−13 lines, 2 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
+ Core.Webserver.Servant: prepareRoutesWithContext :: forall τ (api :: Type) context. (HasServer api context, ServerContext context) => Proxy api -> Context context -> ServerT api (Program τ) -> Program τ Application
Files
core-webserver-servant.cabal view
@@ -5,7 +5,7 @@ -- see: https://github.com/sol/hpack name: core-webserver-servant-version: 0.1.0.0+version: 0.1.1.0 synopsis: Interoperability with Servant description: This is part of a library to help build command-line programs, both tools and longer-running daemons.
lib/Core/Webserver/Servant.hs view
@@ -28,19 +28,27 @@ -} module Core.Webserver.Servant ( prepareRoutes,+ prepareRoutesWithContext, ) where -import Control.Exception.Safe (try) import Control.Monad.Except (ExceptT (..)) import Core.Program-import Core.System (Exception (..), throw)+import Core.System (Exception (..))+import Core.Telemetry.Observability (clearMetrics) import Core.Webserver.Warp import Data.Proxy (Proxy) import GHC.Base (Type) import Network.Wai (Application)-import Servant (Handler (..), ServerT)-import Servant.Server (HasServer, hoistServer, serve)-import Core.Telemetry.Observability (clearMetrics)+import qualified Servant as Servant (+ Handler (..),+ ServerT,+ )+import qualified Servant.Server as Servant (+ Context (..),+ HasServer,+ ServerContext,+ serveWithContextT,+ ) data ContextNotFoundInRequest = ContextNotFoundInRequest deriving (Show) @@ -66,11 +74,26 @@ -} prepareRoutes :: forall τ (api :: Type).- HasServer api '[] =>+ Servant.HasServer api '[] => Proxy api ->- ServerT api (Program τ) ->+ Servant.ServerT api (Program τ) -> Program τ Application-prepareRoutes proxy (routes :: ServerT api (Program τ)) =+prepareRoutes proxy = prepareRoutesWithContext proxy Servant.EmptyContext++{- |+Prepare routes as with 'prepareRoutes' above, but providing a __servant__+'Servant.Server.Context' in order to give detailed control of the setup.++@since 0.1.1+-}+prepareRoutesWithContext ::+ forall τ (api :: Type) context.+ (Servant.HasServer api context, Servant.ServerContext context) =>+ Proxy api ->+ Servant.Context context ->+ Servant.ServerT api (Program τ) ->+ Program τ Application+prepareRoutesWithContext proxy sContext (routes :: Servant.ServerT api (Program τ)) = pure application where application :: Application@@ -86,17 +109,19 @@ context <- case contextFromRequest @τ request of Just context' -> pure context' Nothing -> throw ContextNotFoundInRequest- serve+ Servant.serveWithContextT proxy- (hoistServer proxy (transformProgram context) routes)+ sContext+ (transformProgram context)+ routes request sendResponse - transformProgram :: Context τ -> Program τ α -> Handler α+ transformProgram :: Context τ -> Program τ α -> Servant.Handler α transformProgram context program = let output = try $ subProgram context $ do clearMetrics program- in Handler (ExceptT output)+ in Servant.Handler (ExceptT output)