@@ -13,6 +13,7 @@ module Web.Internal.HttpApiData where
13import Control.Applicative
13import Control.Applicative
14import Data.Traversable (Traversable(traverse))
14import Data.Traversable (Traversable(traverse))
16import Control.Arrow ((&&&), left)
17import Control.Arrow ((&&&), left)
17import Control.Monad ((<=<))
18import Control.Monad ((<=<))
@@ -35,6 +36,7 @@ import Data.Version
36#if MIN_VERSION_base(4,8,0)
37#if MIN_VERSION_base(4,8,0)
37import Data.Void
38import Data.Void
39+import Numeric.Natural
40import Text.Read (readMaybe)
42import Text.Read (readMaybe)
@@ -390,8 +392,8 @@ instance ToHttpApiData Version where
390 toUrlPiece = T.pack . showVersion
392 toUrlPiece = T.pack . showVersion
392#if MIN_VERSION_base(4,8,0)
394#if MIN_VERSION_base(4,8,0)
393−instance ToHttpApiData Void where
395+instance ToHttpApiData Void where toUrlPiece = absurd
394− toUrlPiece = absurd
396+instance ToHttpApiData Natural where toUrlPiece = showt
397instance ToHttpApiData Bool where toUrlPiece = showTextData
399instance ToHttpApiData Bool where toUrlPiece = showTextData
@@ -491,6 +493,13 @@ instance FromHttpApiData Version where
491-- | Parsing a @'Void'@ value is always an error, considering @'Void'@ as a data type with no constructors.
493-- | Parsing a @'Void'@ value is always an error, considering @'Void'@ as a data type with no constructors.
492instance FromHttpApiData Void where
494instance FromHttpApiData Void where
493 parseUrlPiece _ = Left "Void cannot be parsed!"
495 parseUrlPiece _ = Left "Void cannot be parsed!"
497+instance FromHttpApiData Natural where
498+ parseUrlPiece s = do
499+ n <- runReader (signed decimal) s
501+ then Left ("undeflow: " <> s <> " (should be a non-negative integer)")
502+ else Right (fromInteger n)
496instance FromHttpApiData Bool where parseUrlPiece = parseBoundedUrlPiece
505instance FromHttpApiData Bool where parseUrlPiece = parseBoundedUrlPiece