Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package ghc-servant-server for 
openSUSE:Factory checked in at 2022-02-11 23:09:37
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/ghc-servant-server (Old)
 and      /work/SRC/openSUSE:Factory/.ghc-servant-server.new.1956 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "ghc-servant-server"

Fri Feb 11 23:09:37 2022 rev:5 rq:953527 version:0.19

Changes:
--------
--- /work/SRC/openSUSE:Factory/ghc-servant-server/ghc-servant-server.changes    
2021-09-10 23:41:09.570549695 +0200
+++ 
/work/SRC/openSUSE:Factory/.ghc-servant-server.new.1956/ghc-servant-server.changes
  2022-02-11 23:11:34.123320674 +0100
@@ -1,0 +2,22 @@
+Wed Feb  2 13:27:41 UTC 2022 - Peter Simons <psim...@suse.com>
+
+- Update servant-server to version 0.19.
+  Package versions follow the [Package Versioning 
Policy](https://pvp.haskell.org/): in A.B.C, bumps to either A or B represent 
major versions.
+
+  0.19
+  ----
+
+  ### Significant changes
+
+  - Drop support for GHC < 8.6.
+  - Support GHC 9.0 (GHC 9.2 should work as well, but isn't fully tested yet).
+  - Support Aeson 2 
([#1475](https://github.com/haskell-servant/servant/pull/1475)),
+    which fixes a [DOS 
vulnerability](https://github.com/haskell/aeson/issues/864)
+    related to hash collisions.
+  - Add `NamedRoutes` combinator, making support for records first-class in 
Servant
+    ([#1388](https://github.com/haskell-servant/servant/pull/1388)).
+  - Add custom type errors for partially applied combinators
+    ([#1289](https://github.com/haskell-servant/servant/pull/1289),
+    [#1486](https://github.com/haskell-servant/servant/pull/1486)).
+
+-------------------------------------------------------------------

Old:
----
  servant-server-0.18.3.tar.gz

New:
----
  servant-server-0.19.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ ghc-servant-server.spec ++++++
--- /var/tmp/diff_new_pack.VwOoT3/_old  2022-02-11 23:11:34.575321980 +0100
+++ /var/tmp/diff_new_pack.VwOoT3/_new  2022-02-11 23:11:34.579321993 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package ghc-servant-server
 #
-# Copyright (c) 2021 SUSE LLC
+# Copyright (c) 2022 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -19,7 +19,7 @@
 %global pkg_name servant-server
 %bcond_with tests
 Name:           ghc-%{pkg_name}
-Version:        0.18.3
+Version:        0.19
 Release:        0
 Summary:        A family of combinators for defining webservices APIs and 
serving them
 License:        BSD-3-Clause
@@ -31,6 +31,7 @@
 BuildRequires:  ghc-base-compat-devel
 BuildRequires:  ghc-base64-bytestring-devel
 BuildRequires:  ghc-bytestring-devel
+BuildRequires:  ghc-constraints-devel
 BuildRequires:  ghc-containers-devel
 BuildRequires:  ghc-exceptions-devel
 BuildRequires:  ghc-filepath-devel
@@ -92,7 +93,7 @@
 
 %prep
 %autosetup -n %{pkg_name}-%{version}
-cabal-tweak-dep-ver 'base-compat' '< 0.12' '< 0.13'
+cabal-tweak-dep-ver base-compat '< 0.12' '< 1'
 
 %build
 %ghc_lib_build

++++++ servant-server-0.18.3.tar.gz -> servant-server-0.19.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/servant-server-0.18.3/CHANGELOG.md 
new/servant-server-0.19/CHANGELOG.md
--- old/servant-server-0.18.3/CHANGELOG.md      2001-09-09 03:46:40.000000000 
+0200
+++ new/servant-server-0.19/CHANGELOG.md        2001-09-09 03:46:40.000000000 
+0200
@@ -1,6 +1,24 @@
 [The latest version of this document is on 
GitHub.](https://github.com/haskell-servant/servant/blob/master/servant-server/CHANGELOG.md)
 [Changelog for `servant` package contains significant entries for all core 
packages.](https://github.com/haskell-servant/servant/blob/master/servant/CHANGELOG.md)
 
+Package versions follow the [Package Versioning 
Policy](https://pvp.haskell.org/): in A.B.C, bumps to either A or B represent 
major versions.
+
+0.19
+----
+
+### Significant changes
+
+- Drop support for GHC < 8.6.
+- Support GHC 9.0 (GHC 9.2 should work as well, but isn't fully tested yet).
+- Support Aeson 2 
([#1475](https://github.com/haskell-servant/servant/pull/1475)),
+  which fixes a [DOS 
vulnerability](https://github.com/haskell/aeson/issues/864)
+  related to hash collisions.
+- Add `NamedRoutes` combinator, making support for records first-class in 
Servant
+  ([#1388](https://github.com/haskell-servant/servant/pull/1388)).
+- Add custom type errors for partially applied combinators
+  ([#1289](https://github.com/haskell-servant/servant/pull/1289),
+  [#1486](https://github.com/haskell-servant/servant/pull/1486)).
+
 0.18.3
 ------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/servant-server-0.18.3/example/greet.hs 
new/servant-server-0.19/example/greet.hs
--- old/servant-server-0.18.3/example/greet.hs  2001-09-09 03:46:40.000000000 
+0200
+++ new/servant-server-0.19/example/greet.hs    2001-09-09 03:46:40.000000000 
+0200
@@ -1,5 +1,6 @@
 {-# LANGUAGE DataKinds         #-}
 {-# LANGUAGE DeriveGeneric     #-}
+{-# LANGUAGE RecordWildCards   #-}
 {-# LANGUAGE OverloadedStrings #-}
 {-# LANGUAGE PolyKinds         #-}
 {-# LANGUAGE TypeFamilies      #-}
@@ -16,6 +17,8 @@
 import           Network.Wai.Handler.Warp
 
 import           Servant
+import           Servant.Server.Generic ()
+import           Servant.API.Generic
 
 -- * Example
 
@@ -38,6 +41,14 @@
        -- DELETE /greet/:greetid
   :<|> "greet" :> Capture "greetid" Text :> Delete '[JSON] NoContent
 
+  :<|> NamedRoutes OtherRoutes
+
+data OtherRoutes mode = OtherRoutes
+  { version :: mode :- Get '[JSON] Int
+  , bye :: mode :- "bye" :> Capture "name" Text :> Get '[JSON] Text
+  }
+  deriving Generic
+
 testApi :: Proxy TestApi
 testApi = Proxy
 
@@ -48,9 +59,13 @@
 --
 -- Each handler runs in the 'Handler' monad.
 server :: Server TestApi
-server = helloH :<|> postGreetH :<|> deleteGreetH
+server = helloH :<|> postGreetH :<|> deleteGreetH :<|> otherRoutes
+  where otherRoutes = OtherRoutes {..}
+
+        bye name = pure $ "Bye, " <> name <> " !"
+        version = pure 42
 
-  where helloH name Nothing = helloH name (Just False)
+        helloH name Nothing = helloH name (Just False)
         helloH name (Just False) = return . Greet $ "Hello, " <> name
         helloH name (Just True) = return . Greet . toUpper $ "Hello, " <> name
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/servant-server-0.18.3/servant-server.cabal 
new/servant-server-0.19/servant-server.cabal
--- old/servant-server-0.18.3/servant-server.cabal      2001-09-09 
03:46:40.000000000 +0200
+++ new/servant-server-0.19/servant-server.cabal        2001-09-09 
03:46:40.000000000 +0200
@@ -1,6 +1,6 @@
-cabal-version:       >=1.10
+cabal-version:       2.2
 name:                servant-server
-version:             0.18.3
+version:             0.19
 
 synopsis:            A family of combinators for defining webservices APIs and 
serving them
 category:            Servant, Web
@@ -17,13 +17,13 @@
 
 homepage:            http://docs.servant.dev/
 bug-reports:         http://github.com/haskell-servant/servant/issues
-license:             BSD3
+license:             BSD-3-Clause
 license-file:        LICENSE
 author:              Servant Contributors
 maintainer:          haskell-servant-maintain...@googlegroups.com
 copyright:           2014-2016 Zalora South East Asia Pte Ltd, 2016-2019 
Servant Contributors
 build-type:          Simple
-tested-with: GHC ==8.0.2 || ==8.2.2 || ==8.4.4 || ==8.6.5 || ==8.8.4 || 
==8.10.2 || ==9.0.1
+tested-with: GHC ==8.6.5 || ==8.8.4 || ==8.10.2 || ==9.0.1
 
 extra-source-files:
   CHANGELOG.md
@@ -62,6 +62,7 @@
   build-depends:
       base                >= 4.9      && < 4.16
     , bytestring          >= 0.10.8.1 && < 0.12
+    , constraints         >= 0.2      && < 0.14
     , containers          >= 0.5.7.1  && < 0.7
     , mtl                 >= 2.2.2    && < 2.3
     , text                >= 1.2.3.0  && < 1.3
@@ -71,7 +72,7 @@
   -- Servant dependencies
   -- strict dependency as we re-export 'servant' things.
   build-depends:
-      servant             >= 0.18.3   && < 0.18.4
+      servant             >= 0.19
     , http-api-data       >= 0.4.1    && < 0.4.4
 
   -- Other dependencies: Lower bound around what is in the latest Stackage LTS.
@@ -113,7 +114,7 @@
     , text
 
   build-depends:
-      aeson               >= 1.4.1.0  && < 1.6
+      aeson               >= 1.4.1.0  && < 3
     , warp                >= 3.2.25   && < 3.4
 
 test-suite spec
@@ -156,7 +157,7 @@
 
   -- Additional dependencies
   build-depends:
-      aeson                >= 1.4.1.0  && < 1.6
+      aeson                >= 1.4.1.0  && < 3
     , directory            >= 1.3.0.0  && < 1.4
     , hspec                >= 2.6.0    && < 2.9
     , hspec-wai            >= 0.10.1   && < 0.12
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/servant-server-0.18.3/src/Servant/Server/Generic.hs 
new/servant-server-0.19/src/Servant/Server/Generic.hs
--- old/servant-server-0.18.3/src/Servant/Server/Generic.hs     2001-09-09 
03:46:40.000000000 +0200
+++ new/servant-server-0.19/src/Servant/Server/Generic.hs       2001-09-09 
03:46:40.000000000 +0200
@@ -1,12 +1,10 @@
-{-# LANGUAGE ConstraintKinds      #-}
-{-# LANGUAGE DataKinds            #-}
-{-# LANGUAGE FlexibleContexts     #-}
-{-# LANGUAGE KindSignatures       #-}
-{-# LANGUAGE RankNTypes           #-}
-{-# LANGUAGE ScopedTypeVariables  #-}
-{-# LANGUAGE TypeFamilies         #-}
-{-# LANGUAGE TypeOperators        #-}
-{-# LANGUAGE UndecidableInstances #-}
+{-# LANGUAGE DataKinds              #-}
+{-# LANGUAGE FlexibleContexts       #-}
+{-# LANGUAGE RankNTypes             #-}
+{-# LANGUAGE ScopedTypeVariables    #-}
+{-# LANGUAGE TypeFamilies           #-}
+{-# LANGUAGE TypeOperators          #-}
+
 -- | @since 0.14.1
 module Servant.Server.Generic (
     AsServerT,
@@ -15,21 +13,15 @@
     genericServeT,
     genericServeTWithContext,
     genericServer,
-    genericServerT,
+    genericServerT
   ) where
 
 import           Data.Proxy
                  (Proxy (..))
 
-import           Servant.API.Generic
 import           Servant.Server
-
--- | A type that specifies that an API record contains a server implementation.
-data AsServerT (m :: * -> *)
-instance GenericMode (AsServerT m) where
-    type AsServerT m :- api = ServerT api m
-
-type AsServer = AsServerT Handler
+import           Servant.API.Generic
+import           Servant.Server.Internal
 
 -- | Transform a record of routes into a WAI 'Application'.
 genericServe
@@ -97,3 +89,4 @@
     => routes (AsServerT m)
     -> ToServant routes (AsServerT m)
 genericServerT = toServant
+
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/servant-server-0.18.3/src/Servant/Server/Internal/BasicAuth.hs 
new/servant-server-0.19/src/Servant/Server/Internal/BasicAuth.hs
--- old/servant-server-0.18.3/src/Servant/Server/Internal/BasicAuth.hs  
2001-09-09 03:46:40.000000000 +0200
+++ new/servant-server-0.19/src/Servant/Server/Internal/BasicAuth.hs    
2001-09-09 03:46:40.000000000 +0200
@@ -12,8 +12,6 @@
 import qualified Data.ByteString                     as BS
 import           Data.ByteString.Base64
                  (decodeLenient)
-import           Data.Monoid
-                 ((<>))
 import           Data.Typeable
                  (Typeable)
 import           Data.Word8
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/servant-server-0.18.3/src/Servant/Server/Internal/ServerError.hs 
new/servant-server-0.19/src/Servant/Server/Internal/ServerError.hs
--- old/servant-server-0.18.3/src/Servant/Server/Internal/ServerError.hs        
2001-09-09 03:46:40.000000000 +0200
+++ new/servant-server-0.19/src/Servant/Server/Internal/ServerError.hs  
2001-09-09 03:46:40.000000000 +0200
@@ -187,7 +187,7 @@
 -- Example:
 --
 -- > failingHandler :: Handler ()
--- > failingHandler = throwError $ err404 { errBody = "(??????????????????? 
?????????)." }
+-- > failingHandler = throwError $ err404 { errBody = "Are you lost?" }
 --
 err404 :: ServerError
 err404 = ServerError { errHTTPCode = 404
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/servant-server-0.18.3/src/Servant/Server/Internal.hs 
new/servant-server-0.19/src/Servant/Server/Internal.hs
--- old/servant-server-0.18.3/src/Servant/Server/Internal.hs    2001-09-09 
03:46:40.000000000 +0200
+++ new/servant-server-0.19/src/Servant/Server/Internal.hs      2001-09-09 
03:46:40.000000000 +0200
@@ -1,23 +1,22 @@
-{-# LANGUAGE CPP                   #-}
+{-# LANGUAGE AllowAmbiguousTypes   #-}
 {-# LANGUAGE ConstraintKinds       #-}
 {-# LANGUAGE DataKinds             #-}
 {-# LANGUAGE DeriveDataTypeable    #-}
 {-# LANGUAGE FlexibleContexts      #-}
 {-# LANGUAGE FlexibleInstances     #-}
+{-# LANGUAGE InstanceSigs          #-}
 {-# LANGUAGE MultiParamTypeClasses #-}
 {-# LANGUAGE OverloadedStrings     #-}
 {-# LANGUAGE PolyKinds             #-}
+{-# LANGUAGE QuantifiedConstraints #-}
 {-# LANGUAGE RankNTypes            #-}
 {-# LANGUAGE ScopedTypeVariables   #-}
 {-# LANGUAGE TupleSections         #-}
+{-# LANGUAGE TypeApplications      #-}
 {-# LANGUAGE TypeFamilies          #-}
 {-# LANGUAGE TypeOperators         #-}
 {-# LANGUAGE UndecidableInstances  #-}
 
-#if MIN_VERSION_base(4,9,0) && __GLASGOW_HASKELL__ >= 802
-#define HAS_TYPE_ERROR
-#endif
-
 module Servant.Server.Internal
   ( module Servant.Server.Internal
   , module Servant.Server.Internal.BasicAuth
@@ -42,12 +41,11 @@
 import qualified Data.ByteString.Builder                    as BB
 import qualified Data.ByteString.Char8                      as BC8
 import qualified Data.ByteString.Lazy                       as BL
+import           Data.Constraint (Dict(..))
 import           Data.Either
                  (partitionEithers)
 import           Data.Maybe
                  (fromMaybe, isNothing, mapMaybe, maybeToList)
-import           Data.Semigroup
-                 ((<>))
 import           Data.String
                  (IsString (..))
 import           Data.String.Conversions
@@ -56,8 +54,9 @@
                  (Tagged (..), retag, untag)
 import qualified Data.Text                                  as T
 import           Data.Typeable
+import           GHC.Generics
 import           GHC.TypeLits
-                 (KnownNat, KnownSymbol, natVal, symbolVal)
+                 (KnownNat, KnownSymbol, TypeError, symbolVal)
 import qualified Network.HTTP.Media                         as NHM
 import           Network.HTTP.Types                         hiding
                  (Header, ResponseHeaders)
@@ -77,7 +76,8 @@
                  QueryParam', QueryParams, Raw, ReflectMethod (reflectMethod),
                  RemoteHost, ReqBody', SBool (..), SBoolI (..), SourceIO,
                  Stream, StreamBody', Summary, ToSourceIO (..), Vault, Verb,
-                 WithNamedContext)
+                 WithNamedContext, NamedRoutes)
+import           Servant.API.Generic (GenericMode(..), ToServant, 
ToServantApi, GServantProduct, toServant, fromServant)
 import           Servant.API.ContentTypes
                  (AcceptHeader (..), AllCTRender (..), AllCTUnrender (..),
                  AllMime, MimeRender (..), MimeUnrender (..), NoContent,
@@ -87,7 +87,10 @@
                  unfoldRequestArgument)
 import           Servant.API.ResponseHeaders
                  (GetHeaders, Headers, getHeaders, getResponse)
+import           Servant.API.Status
+                 (statusFromNat)
 import qualified Servant.Types.SourceT                      as S
+import           Servant.API.TypeErrors
 import           Web.HttpApiData
                  (FromHttpApiData, parseHeader, parseQueryParam, parseUrlPiece,
                  parseUrlPieces)
@@ -103,12 +106,10 @@
 import           Servant.Server.Internal.RoutingApplication
 import           Servant.Server.Internal.ServerError
 
-#ifdef HAS_TYPE_ERROR
 import           GHC.TypeLits
                  (ErrorMessage (..), TypeError)
 import           Servant.API.TypeLevel
                  (AtLeastOneFragment, FragmentUnique)
-#endif
 
 class HasServer api context where
   type ServerT api (m :: * -> *) :: *
@@ -300,7 +301,7 @@
 
   route Proxy _ = methodRouter ([],) method (Proxy :: Proxy ctypes) status
     where method = reflectMethod (Proxy :: Proxy method)
-          status = toEnum . fromInteger $ natVal (Proxy :: Proxy status)
+          status = statusFromNat (Proxy :: Proxy status)
 
 instance {-# OVERLAPPING #-}
          ( AllCTRender ctypes a, ReflectMethod method, KnownNat status
@@ -312,7 +313,7 @@
 
   route Proxy _ = methodRouter (\x -> (getHeaders x, getResponse x)) method 
(Proxy :: Proxy ctypes) status
     where method = reflectMethod (Proxy :: Proxy method)
-          status = toEnum . fromInteger $ natVal (Proxy :: Proxy status)
+          status = statusFromNat (Proxy :: Proxy status)
 
 instance (ReflectMethod method) =>
          HasServer (NoContentVerb method) context where
@@ -333,7 +334,7 @@
 
   route Proxy _ = streamRouter ([],) method status (Proxy :: Proxy framing) 
(Proxy :: Proxy ctype)
       where method = reflectMethod (Proxy :: Proxy method)
-            status = toEnum . fromInteger $ natVal (Proxy :: Proxy status)
+            status = statusFromNat (Proxy :: Proxy status)
 
 
 instance {-# OVERLAPPING #-}
@@ -347,7 +348,7 @@
 
   route Proxy _ = streamRouter (\x -> (getHeaders x, getResponse x)) method 
status (Proxy :: Proxy framing) (Proxy :: Proxy ctype)
       where method = reflectMethod (Proxy :: Proxy method)
-            status = toEnum . fromInteger $ natVal (Proxy :: Proxy status)
+            status = statusFromNat (Proxy :: Proxy status)
 
 
 streamRouter :: forall ctype a c chunk env framing. (MimeRender ctype chunk, 
FramingRender framing, ToSourceIO chunk a) =>
@@ -786,7 +787,7 @@
 -- * helpers
 
 ct_wildcard :: B.ByteString
-ct_wildcard = "*" <> "/" <> "*" -- Because CPP
+ct_wildcard = "*" <> "/" <> "*"
 
 getAcceptHeader :: Request -> AcceptHeader
 getAcceptHeader = AcceptHeader . fromMaybe ct_wildcard . lookup hAccept . 
requestHeaders
@@ -814,39 +815,15 @@
   hoistServerWithContext _ _ nt s = hoistServerWithContext (Proxy :: Proxy 
subApi) (Proxy :: Proxy subContext) nt s
 
 -------------------------------------------------------------------------------
--- TypeError helpers
+-- Custom type errors
 -------------------------------------------------------------------------------
 
-#ifdef HAS_TYPE_ERROR
--- | This instance catches mistakes when there are non-saturated
--- type applications on LHS of ':>'.
---
--- >>> serve (Proxy :: Proxy (Capture "foo" :> Get '[JSON] Int)) (error "...")
--- ...
--- ...Expected something of kind Symbol or *, got: k -> l on the LHS of ':>'.
--- ...Maybe you haven't applied enough arguments to
--- ...Capture' '[] "foo"
--- ...
---
--- >>> undefined :: Server (Capture "foo" :> Get '[JSON] Int)
--- ...
--- ...Expected something of kind Symbol or *, got: k -> l on the LHS of ':>'.
--- ...Maybe you haven't applied enough arguments to
--- ...Capture' '[] "foo"
--- ...
---
-instance TypeError (HasServerArrowKindError arr) => HasServer ((arr :: k -> l) 
:> api) context
+-- Erroring instance for 'HasServer' when a combinator is not fully applied
+instance TypeError (PartialApplication HasServer arr) => HasServer ((arr :: a 
-> b) :> sub) context
   where
-    type ServerT (arr :> api) m = TypeError (HasServerArrowKindError arr)
-    -- it doesn't really matter what sub route we peak
-    route _ _ _ = error "servant-server panic: impossible happened in 
HasServer (arr :> api)"
-    hoistServerWithContext _ _ _ = id
-
--- Cannot have TypeError here, otherwise use of this symbol will error :)
-type HasServerArrowKindError arr =
-    'Text "Expected something of kind Symbol or *, got: k -> l on the LHS of 
':>'."
-    ':$$: 'Text "Maybe you haven't applied enough arguments to"
-    ':$$: 'ShowType arr
+    type ServerT (arr :> sub) _ = TypeError (PartialApplication HasServer arr)
+    route = error "unreachable"
+    hoistServerWithContext _ _ _ _ = error "unreachable"
 
 -- | This instance prevents from accidentally using '->' instead of ':>'
 --
@@ -880,7 +857,15 @@
     ':$$: 'ShowType a
     ':$$: 'Text "and"
     ':$$: 'ShowType b
-#endif
+
+-- Erroring instances for 'HasServer' for unknown API combinators
+
+-- XXX: This omits the @context@ parameter, e.g.:
+--
+-- "There is no instance for HasServer (Bool :> ???)". Do we care ?
+instance {-# OVERLAPPABLE #-} TypeError (NoInstanceForSub HasServer ty) => 
HasServer (ty :> sub) context
+
+instance {-# OVERLAPPABLE #-} TypeError (NoInstanceFor (HasServer api 
context)) => HasServer api context
 
 -- | Ignore @'Fragment'@ in server handlers.
 -- See <https://ietf.org/rfc/rfc2616.html#section-15.1.3> for more details.
@@ -893,11 +878,7 @@
 -- > server = getBooks
 -- >   where getBooks :: Handler [Book]
 -- >         getBooks = ...return all books...
-#ifdef HAS_TYPE_ERROR
 instance (AtLeastOneFragment api, FragmentUnique (Fragment a1 :> api), 
HasServer api context)
-#else
-instance (HasServer api context)
-#endif
     => HasServer (Fragment a1 :> api) context where
   type ServerT (Fragment a1 :> api) m = ServerT api m
 
@@ -907,3 +888,72 @@
 
 -- $setup
 -- >>> import Servant
+
+-- | A type that specifies that an API record contains a server implementation.
+data AsServerT (m :: * -> *)
+instance GenericMode (AsServerT m) where
+    type AsServerT m :- api = ServerT api m
+
+type AsServer = AsServerT Handler
+
+
+-- | Set of constraints required to convert to / from vanilla server types.
+type GServerConstraints api m =
+  ( ToServant api (AsServerT m) ~ ServerT (ToServantApi api) m
+  , GServantProduct (Rep (api (AsServerT m)))
+  )
+
+-- | This class is a necessary evil: in the implementation of 'HasServer' for
+--  @'NamedRoutes' api@, we essentially need the quantified constraint @forall
+--  m. 'GServerConstraints' m@ to hold.
+--
+-- We cannot require do that directly as the definition of 'GServerConstraints'
+-- contains type family applications ('Rep' and 'ServerT'). The trick is to 
hide
+-- those type family applications behind a typeclass providing evidence for
+-- @'GServerConstraints' api m@ in the form of a dictionary, and require that
+-- @forall m. 'GServer' api m@ instead.
+--
+-- Users shouldn't have to worry about this class, as the only possible 
instance
+-- is provided in this module for all record APIs.
+
+class GServer (api :: * -> *) (m :: * -> *) where
+  gServerProof :: Dict (GServerConstraints api m)
+
+instance
+  ( ToServant api (AsServerT m) ~ ServerT (ToServantApi api) m
+  , GServantProduct (Rep (api (AsServerT m)))
+  ) => GServer api m where
+  gServerProof = Dict
+
+instance
+  ( HasServer (ToServantApi api) context
+  , forall m. Generic (api (AsServerT m))
+  , forall m. GServer api m
+  ) => HasServer (NamedRoutes api) context where
+
+  type ServerT (NamedRoutes api) m = api (AsServerT m)
+
+  route
+    :: Proxy (NamedRoutes api)
+    -> Context context
+    -> Delayed env (api (AsServerT Handler))
+    -> Router env
+  route _ ctx delayed =
+    case gServerProof @api @Handler of
+      Dict -> route (Proxy @(ToServantApi api)) ctx (toServant <$> delayed)
+
+  hoistServerWithContext
+    :: forall m n. Proxy (NamedRoutes api)
+    -> Proxy context
+    -> (forall x. m x -> n x)
+    -> api (AsServerT m)
+    -> api (AsServerT n)
+  hoistServerWithContext _ pctx nat server =
+    case (gServerProof @api @m, gServerProof @api @n) of
+      (Dict, Dict) ->
+        fromServant servantSrvN
+        where
+          servantSrvM :: ServerT (ToServantApi api) m =
+            toServant server
+          servantSrvN :: ServerT (ToServantApi api) n =
+            hoistServerWithContext (Proxy @(ToServantApi api)) pctx nat 
servantSrvM
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/servant-server-0.18.3/src/Servant/Server.hs 
new/servant-server-0.19/src/Servant/Server.hs
--- old/servant-server-0.18.3/src/Servant/Server.hs     2001-09-09 
03:46:40.000000000 +0200
+++ new/servant-server-0.19/src/Servant/Server.hs       2001-09-09 
03:46:40.000000000 +0200
@@ -1,9 +1,10 @@
-{-# LANGUAGE ConstraintKinds  #-}
-{-# LANGUAGE DataKinds        #-}
-{-# LANGUAGE FlexibleContexts #-}
-{-# LANGUAGE RankNTypes       #-}
-{-# LANGUAGE TypeFamilies     #-}
-{-# LANGUAGE TypeOperators    #-}
+{-# LANGUAGE ConstraintKinds     #-}
+{-# LANGUAGE DataKinds           #-}
+{-# LANGUAGE FlexibleContexts    #-}
+{-# LANGUAGE RankNTypes          #-}
+{-# LANGUAGE ScopedTypeVariables #-}
+{-# LANGUAGE TypeFamilies        #-}
+{-# LANGUAGE TypeOperators       #-}
 
 -- | This module lets you implement 'Server's for defined APIs. You'll
 -- most likely just need 'serve'.
@@ -11,6 +12,8 @@
   ( -- * Run a wai application from an API
     serve
   , serveWithContext
+  , serveWithContextT
+  , ServerContext
 
   , -- * Construct a wai Application from an API
     toApplication
@@ -128,6 +131,15 @@
 
 -- * Implementing Servers
 
+-- | Constraints that need to be satisfied on a context for it to be passed to 
'serveWithContext'.
+--
+-- Typically, this will add default context entries to the context. You 
shouldn't typically
+-- need to worry about these constraints, but if you write a helper function 
that wraps
+-- 'serveWithContext', you might need to include this constraint.
+type ServerContext context =
+  ( HasContextEntry (context .++ DefaultErrorFormatters) ErrorFormatters
+  )
+
 -- | 'serve' allows you to implement an API and produce a wai 'Application'.
 --
 -- Example:
@@ -157,11 +169,21 @@
 -- 'defaultErrorFormatters' will always be appended to the end of the passed 
context,
 -- but if you pass your own formatter, it will override the default one.
 serveWithContext :: ( HasServer api context
-                    , HasContextEntry (context .++ DefaultErrorFormatters) 
ErrorFormatters )
+                    , ServerContext context
+                    )
     => Proxy api -> Context context -> Server api -> Application
-serveWithContext p context server =
-  toApplication (runRouter format404 (route p context (emptyDelayed (Route 
server))))
+serveWithContext p context = serveWithContextT p context id
+
+-- | A general 'serve' function that allows you to pass a custom context and 
hoisting function to
+-- apply on all routes.
+serveWithContextT ::
+  forall api context m.
+  (HasServer api context, ServerContext context) =>
+  Proxy api -> Context context -> (forall x. m x -> Handler x) -> ServerT api 
m -> Application
+serveWithContextT p context toHandler server =
+  toApplication (runRouter format404 (route p context (emptyDelayed router)))
   where
+    router = Route $ hoistServerWithContext p (Proxy :: Proxy context) 
toHandler server
     format404 = notFoundErrorFormatter . getContextEntry . 
mkContextWithErrorFormatter $ context
 
 -- | Hoist server implementation.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/servant-server-0.18.3/test/Servant/Server/ErrorSpec.hs 
new/servant-server-0.19/test/Servant/Server/ErrorSpec.hs
--- old/servant-server-0.18.3/test/Servant/Server/ErrorSpec.hs  2001-09-09 
03:46:40.000000000 +0200
+++ new/servant-server-0.19/test/Servant/Server/ErrorSpec.hs    2001-09-09 
03:46:40.000000000 +0200
@@ -12,8 +12,6 @@
                  (encode)
 import qualified Data.ByteString.Char8      as BC
 import qualified Data.ByteString.Lazy.Char8 as BCL
-import           Data.Monoid
-                 ((<>))
 import           Data.Proxy
 import           Data.String.Conversions
                  (cs)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/servant-server-0.18.3/test/Servant/ServerSpec.hs 
new/servant-server-0.19/test/Servant/ServerSpec.hs
--- old/servant-server-0.18.3/test/Servant/ServerSpec.hs        2001-09-09 
03:46:40.000000000 +0200
+++ new/servant-server-0.19/test/Servant/ServerSpec.hs  2001-09-09 
03:46:40.000000000 +0200
@@ -7,6 +7,7 @@
 {-# LANGUAGE ScopedTypeVariables #-}
 {-# LANGUAGE TypeFamilies        #-}
 {-# LANGUAGE TypeOperators       #-}
+{-# LANGUAGE TypeApplications    #-}
 {-# OPTIONS_GHC -freduction-depth=100 #-}
 
 module Servant.ServerSpec where
@@ -28,8 +29,6 @@
                  (fromMaybe)
 import           Data.Proxy
                  (Proxy (Proxy))
-import           Data.SOP
-                 (I (..), NS (..))
 import           Data.String
                  (fromString)
 import           Data.String.Conversions
@@ -699,8 +698,8 @@
        Capture "ok" Bool :> UVerb 'GET '[JSON] UVerbHeaderResponse
 
 uverbResponseHeadersServer :: Server UVerbResponseHeadersApi
-uverbResponseHeadersServer True = pure . Z . I . WithStatus $ addHeader 5 "foo"
-uverbResponseHeadersServer False = pure . S . Z . I . WithStatus $ "bar"
+uverbResponseHeadersServer True = respond . WithStatus @200 . addHeader @"H1" 
(5 :: Int) $ ("foo" :: String)
+uverbResponseHeadersServer False = respond .  WithStatus @404 $ ("bar" :: 
String)
 
 uverbResponseHeadersSpec :: Spec
 uverbResponseHeadersSpec = describe "UVerbResponseHeaders" $ do

Reply via email to