@@ -1,12 +1,22 @@
1{-# LANGUAGE DefaultSignatures #-}
1{-# LANGUAGE DefaultSignatures #-}
2+{-# LANGUAGE OverloadedStrings #-}
2module Web.HttpApiData (
3module Web.HttpApiData (
3 ToHttpApiData (..),
4 ToHttpApiData (..),
4 FromHttpApiData (..),
5 FromHttpApiData (..),
7import Data.ByteString (ByteString)
13import Data.ByteString (ByteString)
8import Data.Text (Text)
15import Data.Text (Text)
9import Data.Text.Encoding (encodeUtf8, decodeUtf8)
16import Data.Text.Encoding (encodeUtf8, decodeUtf8)
17+import qualified Data.Text as Text
19+import Text.Read (readMaybe)
11-- | Convert value to HTTP API data.
21-- | Convert value to HTTP API data.
12class ToHttpApiData a where
22class ToHttpApiData a where
@@ -35,3 +45,23 @@ class FromHttpApiData a where
35 -- | Parse query param value.
45 -- | Parse query param value.
36 parseQueryParam :: Text -> Either Text a
46 parseQueryParam :: Text -> Either Text a
37 parseQueryParam = parseUrlPiece
47 parseQueryParam = parseUrlPiece
49+-- | Convert @'Maybe'@ parser into @'Either' 'Text'@ parser with default error message.
50+parseMaybeUrlPiece :: (Text -> Maybe a) -> (Text -> Either Text a)
51+parseMaybeUrlPiece parse input =
53+ Nothing -> Left ("parseUrlPiece: could not convert: `" <> input <> "'")
54+ Just val -> Right val
56+-- | Convert to URL piece using @'Show'@ instance.
57+showUrlPiece :: Show a => a -> Text
58+showUrlPiece = Text.pack . show
60+-- | Parse URL piece using @'Read'@ instance.
61+readMaybeUrlPiece :: Read a => Text -> Maybe a
62+readMaybeUrlPiece = readMaybe . Text.unpack
64+-- | Parse URL piece using @'Read'@ instance.
65+readEitherUrlPiece :: Read a => Text -> Either Text a
66+readEitherUrlPiece = parseMaybeUrlPiece readMaybeUrlPiece