git.iko.soy/typeable/http-api-data
on master help sign in
Add FromHttpApiData (F.Fixed a)
81c866bOleg Grenrus
src/Web/Internal/HttpApiData.hs+3
@@ -609,6 +609,9 @@ instance FromHttpApiData String where parseUrlPiece = Right . T.unpack
609instance FromHttpApiData Text where parseUrlPiece = Right
609instance FromHttpApiData Text where parseUrlPiece = Right
610instance FromHttpApiData L.Text where parseUrlPiece = Right . L.fromStrict
610instance FromHttpApiData L.Text where parseUrlPiece = Right . L.fromStrict
611
611
612+instance F.HasResolution a => FromHttpApiData (F.Fixed a) where
613+ parseUrlPiece = runReader rational
614+
612-- |
615-- |
613-- >>> toGregorian <$> parseUrlPiece "2016-12-01"
616-- >>> toGregorian <$> parseUrlPiece "2016-12-01"
614-- Right (2016,12,1)
617-- Right (2016,12,1)
test/Web/Internal/HttpApiDataSpec.hs+16−60
@@ -43,30 +43,24 @@ import Web.Internal.TestInstances
43encodedUrlPieceProp :: ToHttpApiData a => a -> Property
43encodedUrlPieceProp :: ToHttpApiData a => a -> Property
44encodedUrlPieceProp x = toLazyByteString (toEncodedUrlPiece (toUrlPiece x)) === toLazyByteString (toEncodedUrlPiece x)
44encodedUrlPieceProp x = toLazyByteString (toEncodedUrlPiece (toUrlPiece x)) === toLazyByteString (toEncodedUrlPiece x)
45
45
46−
46+-- | Check 'ToHttpApiData' and 'FromHttpApiData' compatibility
47checkUrlPiece :: forall a. (Eq a, ToHttpApiData a, FromHttpApiData a, Show a, Arbitrary a) => Proxy a -> String -> Spec
47checkUrlPiece :: forall a. (Eq a, ToHttpApiData a, FromHttpApiData a, Show a, Arbitrary a) => Proxy a -> String -> Spec
48−checkUrlPiece _ name = prop name (toUrlPiece <=> parseUrlPiece :: a -> Property)
48+checkUrlPiece _ = checkUrlPiece' (arbitrary :: Gen a)
49
49
50−-- | Check with given generator
51checkUrlPiece' :: forall a. (Eq a, ToHttpApiData a, FromHttpApiData a, Show a) => Gen a -> String -> Spec
50checkUrlPiece' :: forall a. (Eq a, ToHttpApiData a, FromHttpApiData a, Show a) => Gen a -> String -> Spec
51+checkUrlPiece' gen name = describe name $ do
52−checkUrlPiece' gen name = prop name $ forAll gen (toUrlPiece <=> parseUrlPiece)
52+ prop "toUrlPiece <=> parseUrlPiece" $ forAll gen (toUrlPiece <=> parseUrlPiece :: a -> Property)
53+ prop "toQueryParam <=> parseQueryParam" $ forAll gen (toQueryParam <=> parseQueryParam :: a -> Property)
54+ prop "toHeader <=> parseHeader" $ forAll gen (toHeader <=> parseHeader :: a -> Property)
55+ prop "toEncodedUrlPiece encodes correctly" $ forAll gen encodedUrlPieceProp
53
56
54-- | Check case insensitivity for @parseUrlPiece@.
57-- | Check case insensitivity for @parseUrlPiece@.
55checkUrlPieceI :: forall a. (Eq a, ToHttpApiData a, FromHttpApiData a, Arbitrary a) => Proxy a -> String -> Spec
58checkUrlPieceI :: forall a. (Eq a, ToHttpApiData a, FromHttpApiData a, Arbitrary a) => Proxy a -> String -> Spec
56checkUrlPieceI _ = checkUrlPiece (Proxy :: Proxy (RandomCase a))
59checkUrlPieceI _ = checkUrlPiece (Proxy :: Proxy (RandomCase a))
57
60
58−-- | Check that 'toEncodedUrlPiece' is equivallent to default implementation.
59−checkEncodedUrlPiece :: forall a. (Show a, ToHttpApiData a, Arbitrary a) => Proxy a -> String -> Spec
60−checkEncodedUrlPiece _ = checkEncodedUrlPiece' (arbitrary :: Gen a)
61−
62−-- | Check that 'toEncodedUrlPiece' is equivalent to default implementation.
63−-- Use a given generator.
64−checkEncodedUrlPiece' :: forall a. (Show a, ToHttpApiData a) => Gen a -> String -> Spec
65−checkEncodedUrlPiece' gen name = prop name $ forAll gen encodedUrlPieceProp
66−
67spec :: Spec
61spec :: Spec
68spec = do
62spec = do
69− describe "toUrlPiece <=> parseUrlPiece" $ do
63+ describe "Instances" $ do
70 checkUrlPiece (Proxy :: Proxy ()) "()"
64 checkUrlPiece (Proxy :: Proxy ()) "()"
71 checkUrlPiece (Proxy :: Proxy Char) "Char"
65 checkUrlPiece (Proxy :: Proxy Char) "Char"
72 checkUrlPieceI (Proxy :: Proxy Bool) "Bool"
66 checkUrlPieceI (Proxy :: Proxy Bool) "Bool"
@@ -95,6 +89,14 @@ spec = do
95 checkUrlPiece' uuidGen "UUID"
89 checkUrlPiece' uuidGen "UUID"
96 checkUrlPiece' setCookieGen "Cookie"
90 checkUrlPiece' setCookieGen "Cookie"
97
91
92+ checkUrlPiece (Proxy :: Proxy F.Uni) "Uni"
93+ checkUrlPiece (Proxy :: Proxy F.Deci) "Deci"
94+ checkUrlPiece (Proxy :: Proxy F.Centi) "Centi"
95+ checkUrlPiece (Proxy :: Proxy F.Milli) "Milli"
96+ checkUrlPiece (Proxy :: Proxy F.Micro) "Micro"
97+ checkUrlPiece (Proxy :: Proxy F.Nano) "Nano"
98+ checkUrlPiece (Proxy :: Proxy F.Pico) "Pico"
99+
98 checkUrlPiece (Proxy :: Proxy (Maybe String)) "Maybe String"
100 checkUrlPiece (Proxy :: Proxy (Maybe String)) "Maybe String"
99 checkUrlPieceI (Proxy :: Proxy (Maybe Integer)) "Maybe Integer"
101 checkUrlPieceI (Proxy :: Proxy (Maybe Integer)) "Maybe Integer"
100 checkUrlPiece (Proxy :: Proxy (Either Integer T.Text)) "Either Integer Text"
102 checkUrlPiece (Proxy :: Proxy (Either Integer T.Text)) "Either Integer Text"
@@ -104,52 +106,6 @@ spec = do
104 checkUrlPiece (Proxy :: Proxy Natural) "Natural"
106 checkUrlPiece (Proxy :: Proxy Natural) "Natural"
105#endif
107#endif
106
108
107− describe "toEncodedUrlPiece encodes correctly" $ do
108− checkEncodedUrlPiece (Proxy :: Proxy ()) "()"
109− checkEncodedUrlPiece (Proxy :: Proxy Char) "Char"
110− checkEncodedUrlPiece (Proxy :: Proxy Bool) "Bool"
111− checkEncodedUrlPiece (Proxy :: Proxy Ordering) "Ordering"
112− checkEncodedUrlPiece (Proxy :: Proxy Int) "Int"
113− checkEncodedUrlPiece (Proxy :: Proxy Int8) "Int8"
114− checkEncodedUrlPiece (Proxy :: Proxy Int16) "Int16"
115− checkEncodedUrlPiece (Proxy :: Proxy Int32) "Int32"
116− checkEncodedUrlPiece (Proxy :: Proxy Int64) "Int64"
117− checkEncodedUrlPiece (Proxy :: Proxy Integer) "Integer"
118− checkEncodedUrlPiece (Proxy :: Proxy Word) "Word"
119− checkEncodedUrlPiece (Proxy :: Proxy Word8) "Word8"
120− checkEncodedUrlPiece (Proxy :: Proxy Word16) "Word16"
121− checkEncodedUrlPiece (Proxy :: Proxy Word32) "Word32"
122− checkEncodedUrlPiece (Proxy :: Proxy Word64) "Word64"
123− checkEncodedUrlPiece (Proxy :: Proxy String) "String"
124− checkEncodedUrlPiece (Proxy :: Proxy T.Text) "Text.Strict"
125− checkEncodedUrlPiece (Proxy :: Proxy L.Text) "Text.Lazy"
126− checkEncodedUrlPiece (Proxy :: Proxy Day) "Day"
127− checkEncodedUrlPiece' timeOfDayGen "TimeOfDay"
128− checkEncodedUrlPiece' localTimeGen "LocalTime"
129− checkEncodedUrlPiece' zonedTimeGen "ZonedTime"
130− checkEncodedUrlPiece' utcTimeGen "UTCTime"
131− checkEncodedUrlPiece' nominalDiffTimeGen "NominalDiffTime"
132− checkEncodedUrlPiece (Proxy :: Proxy Version) "Version"
133− checkEncodedUrlPiece' uuidGen "UUID"
134− checkEncodedUrlPiece' setCookieGen "SetCookie"
135−
136− checkEncodedUrlPiece (Proxy :: Proxy (Maybe String)) "Maybe String"
137− checkEncodedUrlPiece (Proxy :: Proxy (Maybe Integer)) "Maybe Integer"
138− checkEncodedUrlPiece (Proxy :: Proxy (Either Integer T.Text)) "Either Integer Text"
139− checkEncodedUrlPiece (Proxy :: Proxy (Either Version Day)) "Either Version Day"
140−
141−#if MIN_VERSION_base(4,8,0)
142− checkEncodedUrlPiece (Proxy :: Proxy Natural) "Natural"
143−#endif
144−
145− checkEncodedUrlPiece (Proxy :: Proxy F.Uni) "Uni"
146− checkEncodedUrlPiece (Proxy :: Proxy F.Deci) "Deci"
147− checkEncodedUrlPiece (Proxy :: Proxy F.Centi) "Centi"
148− checkEncodedUrlPiece (Proxy :: Proxy F.Milli) "Milli"
149− checkEncodedUrlPiece (Proxy :: Proxy F.Micro) "Micro"
150− checkEncodedUrlPiece (Proxy :: Proxy F.Nano) "Nano"
151− checkEncodedUrlPiece (Proxy :: Proxy F.Pico) "Pico"
152−
153 it "bad integers are rejected" $ do
109 it "bad integers are rejected" $ do
154 parseUrlPieceMaybe (T.pack "123hello") `shouldBe` (Nothing :: Maybe Int)
110 parseUrlPieceMaybe (T.pack "123hello") `shouldBe` (Nothing :: Maybe Int)
155
111