Created
December 8, 2021 10:46
-
-
Save mklinik/84499fb28c3d5e6122da58d1ed13d749 to your computer and use it in GitHub Desktop.
Minimal example for the servant-pagination Next-Range issue
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
{-# OPTIONS_GHC -fno-warn-orphans #-} | |
{-# LANGUAGE TypeApplications #-} | |
{-# LANGUAGE DeriveGeneric #-} | |
{-# LANGUAGE DataKinds #-} | |
{-# LANGUAGE TypeOperators #-} | |
{-# LANGUAGE MultiParamTypeClasses #-} | |
{-# LANGUAGE TypeFamilies #-} | |
module Main where | |
import Data.Aeson (ToJSON) | |
import GHC.Generics (Generic) | |
import qualified Data.Aeson as Aeson | |
import Data.Maybe (fromMaybe) | |
import Data.Proxy (Proxy (..)) | |
import Servant | |
import Servant.Pagination | |
import qualified Network.Wai.Handler.Warp as Warp | |
data Color = Color | |
{ name :: String | |
, rgb :: [Int] | |
, hex :: String | |
} deriving (Eq, Show, Generic) | |
instance ToJSON Color where | |
toJSON = | |
Aeson.genericToJSON Aeson.defaultOptions | |
colors :: [Color] | |
colors = | |
[ Color "Aqua" [0, 255, 255] "#00ffff" | |
, Color "Black" [0, 0, 0] "#000000" | |
, Color "Blue" [0, 0, 255] "#0000ff" | |
] | |
instance HasPagination Color "name" where | |
type RangeType Color "name" = String | |
getFieldValue _ = name | |
type API = | |
"colors" | |
:> Header "Range" (Ranges '["name"] Color) | |
:> GetPartialContent '[JSON] (Headers (PageHeaders '["name"] Color) [Color]) | |
defaultRange :: Range "name" String | |
defaultRange = | |
getDefaultRange (Proxy @Color) | |
server :: Server API | |
server mrange = do | |
let range = | |
fromMaybe defaultRange (mrange >>= extractRange) | |
returnRange range (applyRange range colors) | |
main :: IO () | |
main = | |
Warp.run 1337 (serve (Proxy :: Proxy API) server) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment