on master help sign in
Merge pull request #485 from phadej/uuid

Add UUID instances

commit38af5f35b3b542550f9a80d228ca07ff59ee299c authorAdam Bergmark <adam@bergmark.nl> dateMon 12 Dec 2016, 17:48 (10 years ago) parentc1490385173ab0
7 files changed+46
Data/Aeson/Types/FromJSON.hs+13 Data/Aeson/Types/ToJSON.hs+15 aeson.cabal+2 benchmarks/aeson-benchmarks.cabal+1 tests/Instances.hs+8 tests/Properties.hs+3 tests/UnitTests.hs+4
Data/Aeson/Types/FromJSON.hs+13
@@ -123,6 +123,7 @@ import qualified Data.Text as T
123123import qualified Data.Text.Encoding as T
124124import qualified Data.Text.Lazy as LT
125125import qualified Data.Tree as Tree
126+import qualified Data.UUID.Types as UUID
126127import qualified Data.Vector as V
127128import qualified Data.Vector.Generic as VG
128129import qualified Data.Vector.Primitive as VP
@@ -1486,6 +1487,18 @@ instance (FromJSON v) => FromJSON (Tree.Tree v) where
14861487 parseJSON = parseJSON1
14871488 {-# INLINE parseJSON #-}
14881489
1490+-------------------------------------------------------------------------------
1491+-- uuid
1492+-------------------------------------------------------------------------------
1493+
1494+instance FromJSON UUID.UUID where
1495+ parseJSON = withText "UUID" $
1496+ maybe (fail "Invalid UUID") pure . UUID.fromText
1497+
1498+instance FromJSONKey UUID.UUID where
1499+ fromJSONKey = FromJSONKeyTextParser $
1500+ maybe (fail "Invalid UUID") pure . UUID.fromText
1501+
14891502-------------------------------------------------------------------------------
14901503-- vector
14911504-------------------------------------------------------------------------------
Data/Aeson/Types/ToJSON.hs+15
@@ -113,6 +113,7 @@ import qualified Data.Text as T
113113import qualified Data.Text.Encoding as T
114114import qualified Data.Text.Lazy as LT
115115import qualified Data.Tree as Tree
116+import qualified Data.UUID.Types as UUID
116117import qualified Data.Vector as V
117118import qualified Data.Vector.Generic as VG
118119import qualified Data.Vector.Mutable as VM
@@ -120,6 +121,9 @@ import qualified Data.Vector.Primitive as VP
120121import qualified Data.Vector.Storable as VS
121122import qualified Data.Vector.Unboxed as VU
122123
124+import qualified Data.Aeson.Encoding.Builder as EB
125+import qualified Data.ByteString.Builder as B
126+
123127#if !(MIN_VERSION_bytestring(0,10,0))
124128import Foreign.ForeignPtr (withForeignPtr)
125129import Foreign.Marshal.Utils (copyBytes)
@@ -1857,6 +1861,17 @@ instance (ToJSON v) => ToJSON (Tree.Tree v) where
18571861 toEncoding = toEncoding1
18581862 {-# INLINE toEncoding #-}
18591863
1864+-------------------------------------------------------------------------------
1865+-- uuid
1866+-------------------------------------------------------------------------------
1867+
1868+instance ToJSON UUID.UUID where
1869+ toJSON = toJSON . UUID.toText
1870+ toEncoding = E.unsafeToEncoding . EB.quote . B.byteString . UUID.toASCIIBytes
1871+
1872+instance ToJSONKey UUID.UUID where
1873+ toJSONKey = ToJSONKeyText UUID.toText $
1874+ E.unsafeToEncoding . EB.quote . B.byteString . UUID.toASCIIBytes
18601875
18611876-------------------------------------------------------------------------------
18621877-- vector
aeson.cabal+2
@@ -117,6 +117,7 @@ library
117117 time >= 1.1.1.4,
118118 time-locale-compat >= 0.1.1 && < 0.2,
119119 unordered-containers >= 0.2.5.0,
120+ uuid-types >= 1.0.3 && <1.1,
120121 vector >= 0.8
121122
122123 if flag(bytestring-builder)
@@ -198,6 +199,7 @@ test-suite tests
198199 time,
199200 time-locale-compat,
200201 unordered-containers,
202+ uuid-types,
201203 vector,
202204 quickcheck-instances >=0.3.12
203205
benchmarks/aeson-benchmarks.cabal+1
@@ -53,6 +53,7 @@ library
5353 time,
5454 transformers,
5555 unordered-containers >= 0.2.3.0,
56+ uuid-types >= 1.0.3 && <1.1,
5657 vector >= 0.7.1
5758
5859 if flag(bytestring-builder)
tests/Instances.hs+8
@@ -25,6 +25,7 @@ import Test.QuickCheck (Arbitrary(..), elements, oneof)
2525import Types
2626import qualified Data.DList as DList
2727import qualified Data.HashMap.Strict as HM
28+import qualified Data.UUID.Types as UUID
2829
2930#if !MIN_VERSION_QuickCheck(2,9,0)
3031import Control.Applicative (Const(..))
@@ -218,3 +219,10 @@ makeVersion b = Version b []
218219instance Arbitrary a => Arbitrary (Identity a) where
219220 arbitrary = Identity <$> arbitrary
220221#endif
222+
223+instance Arbitrary UUID.UUID where
224+ arbitrary = UUID.fromWords
225+ <$> arbitrary
226+ <*> arbitrary
227+ <*> arbitrary
228+ <*> arbitrary
tests/Properties.hs+3
@@ -41,6 +41,7 @@ import qualified Data.HashMap.Strict as H
4141import qualified Data.Map as Map
4242import qualified Data.Text as T
4343import qualified Data.Text.Lazy as LT
44+import qualified Data.UUID.Types as UUID
4445import qualified Data.Vector as V
4546
4647encodeDouble :: Double -> Double -> Property
@@ -217,6 +218,7 @@ tests = testGroup "properties" [
217218 , testProperty "Seq" $ roundTripEq (undefined :: Seq Int)
218219 , testProperty "Rational" $ roundTripEq (undefined :: Rational)
219220 , testProperty "Ratio Int" $ roundTripEq (undefined :: Ratio Int)
221+ , testProperty "UUID" $ roundTripEq UUID.nil
220222 , testGroup "functors"
221223 [ testProperty "Identity Char" $ roundTripEq (undefined :: I Int)
222224
@@ -278,6 +280,7 @@ tests = testGroup "properties" [
278280#endif
279281 , testProperty "Version" $ roundTripKey (undefined :: Version)
280282 , testProperty "Lazy Text" $ roundTripKey (undefined :: LT.Text)
283+ , testProperty "UUID" $ roundTripKey UUID.nil
281284 ]
282285 , testGroup "toFromJSON" [
283286 testProperty "Integer" (toFromJSON :: Integer -> Property)
tests/UnitTests.hs+4
@@ -76,6 +76,7 @@ import qualified Data.Text.Lazy.Builder as TLB
7676import qualified Data.Text.Lazy.Encoding as LT
7777import qualified Data.Text.Lazy.Encoding as TLE
7878import qualified Data.Tree as Tree
79+import qualified Data.UUID.Types as UUID
7980import qualified Data.Vector as Vector
8081
8182tests :: Test
@@ -369,6 +370,9 @@ jsonExamples =
369370 , Example "Pico" "3.14" (3.14 :: Pico)
370371 , Example "Scientific" "3.14" (3.14 :: Scientific)
371372
373+ , Example "UUID" "\"c2cc10e1-57d6-4b6f-9899-38d972112d8c\"" $ UUID.fromWords
374+ 0xc2cc10e1 0x57d64b6f 0x989938d9 0x72112d8c
375+
372376 , Example "Set Int" "[1,2,3]" (Set.fromList [3, 2, 1] :: Set.Set Int)
373377 , Example "IntSet" "[1,2,3]" (IntSet.fromList [3, 2, 1])
374378 , Example "IntMap" "[[1,2],[3,4]]" (IntMap.fromList [(3,4), (1,2)] :: IntMap.IntMap Int)