on master help sign in
Merge pull request #396 from Tritlo/master

use mconcat and intersperse to avoid extra commas. Fixes #387

commitf01be6f4b077bea33bd025157e12a7f2136cd997 authorAdam Bergmark <adam@bergmark.nl> dateThu 2 Jun 2016, 20:03 (10 years ago) parent722b577b9f51cc
4 files changed+26−1
Data/Aeson/Types/Generic.hs+12−1 tests/Encoders.hs+7 tests/Options.hs+5 tests/Properties.hs+2
Data/Aeson/Types/Generic.hs+12−1
@@ -30,9 +30,11 @@ import Data.Aeson.Types.Instances
3030import Data.Aeson.Types.Internal
3131import Data.Bits (unsafeShiftR)
3232import Data.ByteString.Builder as B
33+import qualified Data.ByteString.Lazy as BSL (null)
3334import Data.DList (DList, toList, empty)
3435import Data.Maybe (fromMaybe)
3536import Data.Monoid ((<>))
37+import Data.List (intersperse)
3638import Data.Text (Text, pack, unpack)
3739import GHC.Generics
3840import qualified Data.HashMap.Strict as H
@@ -41,7 +43,7 @@ import qualified Data.Vector.Mutable as VM
4143
4244#if !MIN_VERSION_base(4,8,0)
4345import Control.Applicative ((<*>), (<$>), pure)
44−import Data.Monoid (mempty)
46+import Data.Monoid (mempty, mconcat)
4547#endif
4648
4749--------------------------------------------------------------------------------
@@ -380,6 +382,11 @@ class RecordToEncoding f where
380382 recordToEncoding :: Options -> f a -> (B.Builder, Maybe B.Builder)
381383
382384instance (RecordToEncoding a, RecordToEncoding b) => RecordToEncoding (a :*: b) where
385+ recordToEncoding opts (a :*: b) | omitNothingFields opts =
386+ (mconcat $ intersperse (B.char7 ',') $
387+ filter (not . BSL.null . B.toLazyByteString)
388+ [fst (recordToEncoding opts a), fst (recordToEncoding opts b)]
389+ , Nothing)
383390 recordToEncoding opts (a :*: b) =
384391 (fst (recordToEncoding opts a) <> B.char7 ',' <>
385392 fst (recordToEncoding opts b),
@@ -430,6 +437,10 @@ class EncodeProduct f where
430437
431438instance ( EncodeProduct a
432439 , EncodeProduct b ) => EncodeProduct (a :*: b) where
440+ encodeProduct opts (a :*: b) | omitNothingFields opts =
441+ mconcat $ intersperse (B.char7 ',') $
442+ filter (not . BSL.null . B.toLazyByteString)
443+ [encodeProduct opts a, encodeProduct opts b]
433444 encodeProduct opts (a :*: b) = encodeProduct opts a <>
434445 B.char7 ',' <>
435446 encodeProduct opts b
tests/Encoders.hs+7
@@ -160,6 +160,13 @@ gSomeTypeParseJSONObjectWithSingleField :: Value -> Parser (SomeType Int)
160160gSomeTypeParseJSONObjectWithSingleField = genericParseJSON optsObjectWithSingleField
161161
162162
163+gSomeTypeToJSONOmitNothingFields :: SomeType Int -> Value
164+gSomeTypeToJSONOmitNothingFields = genericToJSON optsOmitNothingFields
165+
166+gSomeTypeToEncodingOmitNothingFields :: SomeType Int -> Encoding
167+gSomeTypeToEncodingOmitNothingFields = genericToEncoding optsOmitNothingFields
168+
169+
163170--------------------------------------------------------------------------------
164171-- Approx encoders/decoders
165172--------------------------------------------------------------------------------
tests/Options.hs+5
@@ -29,3 +29,8 @@ optsObjectWithSingleField = optsDefault
2929 { allNullaryToStringTag = False
3030 , sumEncoding = ObjectWithSingleField
3131 }
32+
33+optsOmitNothingFields :: Options
34+optsOmitNothingFields = optsDefault
35+ { omitNothingFields = True
36+ }
tests/Properties.hs+2
@@ -215,6 +215,8 @@ tests = testGroup "properties" [
215215 , testProperty "SomeTypeObjectWithSingleField" $
216216 gSomeTypeToJSONObjectWithSingleField `sameAs`
217217 gSomeTypeToEncodingObjectWithSingleField
218+ , testProperty "SomeTypeOmitNothingFields" $
219+ gSomeTypeToJSONOmitNothingFields `sameAs` gSomeTypeToEncodingOmitNothingFields
218220 ]
219221 ]
220222 , testGroup "template-haskell" [