git.iko.soy/typeable/http-api-data
on master help sign in
Use Data.Text.Read to parse numbers
commit60ea9224446711125ed0d9ab733a649c6dbc9909 authorNickolay Kudasov <nickolay.kudasov@gmail.com> dateSun 4 Oct 2015, 01:36 (11 years ago) parent7dd2e4a
1 file changed+20−13
Web/HttpApiData.hs+20−13
Web/HttpApiData.hs+20−13
@@ -10,6 +10,8 @@ module Web.HttpApiData (
1010 readEitherUrlPiece,
1111) where
1212
13+import Control.Arrow ((+++))
14+
1315import Data.Monoid
1416import Data.ByteString (ByteString)
1517
@@ -17,6 +19,7 @@ import Data.Int
1719import Data.Word
1820
1921import Data.Text (Text)
22+import Data.Text.Read (signed, decimal, rational, Reader)
2023import Data.Text.Encoding (encodeUtf8, decodeUtf8)
2124import qualified Data.Text as Text
2225
@@ -69,6 +72,10 @@ readMaybeUrlPiece = readMaybe . Text.unpack
6972readEitherUrlPiece :: Read a => Text -> Either Text a
7073readEitherUrlPiece = parseMaybeUrlPiece readMaybeUrlPiece
7174
75+-- | Run @'Reader'@ as HTTP API data parser.
76+runReader :: Reader a -> Text -> Either Text a
77+runReader reader = (Text.pack +++ fst) . reader
78+
7279instance ToHttpApiData Bool where toUrlPiece = showUrlPiece
7380instance ToHttpApiData Double where toUrlPiece = showUrlPiece
7481instance ToHttpApiData Float where toUrlPiece = showUrlPiece
@@ -87,19 +94,19 @@ instance ToHttpApiData [Char] where toUrlPiece = Text.pack
8794instance ToHttpApiData Text where toUrlPiece = id
8895
8996instance FromHttpApiData Bool where parseUrlPiece = readEitherUrlPiece
90−instance FromHttpApiData Double where parseUrlPiece = readEitherUrlPiece
91−instance FromHttpApiData Float where parseUrlPiece = readEitherUrlPiece
92−instance FromHttpApiData Int where parseUrlPiece = readEitherUrlPiece
93−instance FromHttpApiData Int8 where parseUrlPiece = readEitherUrlPiece
94−instance FromHttpApiData Int16 where parseUrlPiece = readEitherUrlPiece
95−instance FromHttpApiData Int32 where parseUrlPiece = readEitherUrlPiece
96−instance FromHttpApiData Int64 where parseUrlPiece = readEitherUrlPiece
97−instance FromHttpApiData Integer where parseUrlPiece = readEitherUrlPiece
98−instance FromHttpApiData Word where parseUrlPiece = readEitherUrlPiece
99−instance FromHttpApiData Word8 where parseUrlPiece = readEitherUrlPiece
100−instance FromHttpApiData Word16 where parseUrlPiece = readEitherUrlPiece
101−instance FromHttpApiData Word32 where parseUrlPiece = readEitherUrlPiece
102−instance FromHttpApiData Word64 where parseUrlPiece = readEitherUrlPiece
97+instance FromHttpApiData Double where parseUrlPiece = runReader rational
98+instance FromHttpApiData Float where parseUrlPiece = runReader rational
99+instance FromHttpApiData Int where parseUrlPiece = runReader (signed decimal)
100+instance FromHttpApiData Int8 where parseUrlPiece = runReader (signed decimal)
101+instance FromHttpApiData Int16 where parseUrlPiece = runReader (signed decimal)
102+instance FromHttpApiData Int32 where parseUrlPiece = runReader (signed decimal)
103+instance FromHttpApiData Int64 where parseUrlPiece = runReader (signed decimal)
104+instance FromHttpApiData Integer where parseUrlPiece = runReader (signed decimal)
105+instance FromHttpApiData Word where parseUrlPiece = runReader decimal
106+instance FromHttpApiData Word8 where parseUrlPiece = runReader decimal
107+instance FromHttpApiData Word16 where parseUrlPiece = runReader decimal
108+instance FromHttpApiData Word32 where parseUrlPiece = runReader decimal
109+instance FromHttpApiData Word64 where parseUrlPiece = runReader decimal
103110instance FromHttpApiData [Char] where parseUrlPiece = Right . Text.unpack
104111instance FromHttpApiData Text where parseUrlPiece = Right
105112