git.iko.soy/typeable/http-api-data
on master help sign in
Add helper functions for URL piece
66513daNickolay Kudasov
Web/HttpApiData.hs+30
@@ -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 (..),
6+ parseMaybeUrlPiece,
7+ showUrlPiece,
8+ readMaybeUrlPiece,
9+ readEitherUrlPiece,
5) where
10) where
6
11
12+import Data.Monoid
7import Data.ByteString (ByteString)
13import Data.ByteString (ByteString)
14+
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
18+
19+import Text.Read (readMaybe)
10
20
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
48+
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 =
52+ case parse input of
53+ Nothing -> Left ("parseUrlPiece: could not convert: `" <> input <> "'")
54+ Just val -> Right val
55+
56+-- | Convert to URL piece using @'Show'@ instance.
57+showUrlPiece :: Show a => a -> Text
58+showUrlPiece = Text.pack . show
59+
60+-- | Parse URL piece using @'Read'@ instance.
61+readMaybeUrlPiece :: Read a => Text -> Maybe a
62+readMaybeUrlPiece = readMaybe . Text.unpack
63+
64+-- | Parse URL piece using @'Read'@ instance.
65+readEitherUrlPiece :: Read a => Text -> Either Text a
66+readEitherUrlPiece = parseMaybeUrlPiece readMaybeUrlPiece
67+