@@ -44,7 +44,6 @@ module Data.Aeson.Types.Internal
45 , parseEither
45 , parseEither
46 , parseMaybe
46 , parseMaybe
48 , modifyFailure
47 , modifyFailure
49 , prependFailure
48 , prependFailure
50 , parserThrowError
49 , parserThrowError
@@ -95,6 +94,7 @@ import Data.HashMap.Strict (HashMap)
95import Data.Hashable (Hashable(..))
94import Data.Hashable (Hashable(..))
96import Data.List (intercalate)
95import Data.List (intercalate)
97import Data.Scientific (Scientific)
96import Data.Scientific (Scientific)
97+import Data.Semigroup (Semigroup((<>)))
98import Data.String (IsString(..))
98import Data.String (IsString(..))
99import Data.Text (Text, pack, unpack)
99import Data.Text (Text, pack, unpack)
100import Data.Time (UTCTime)
100import Data.Time (UTCTime)
@@ -342,10 +342,6 @@ instance Monoid (Parser a) where
342 mappend = (<>)
342 mappend = (<>)
343 {-# INLINE mappend #-}
343 {-# INLINE mappend #-}
345−-- | Raise a parsing failure with some custom message.
346−parseFail :: String -> Parser a
349apP :: Parser (a -> b) -> Parser a -> Parser b
345apP :: Parser (a -> b) -> Parser a -> Parser b
350apP d e = do
346apP d e = do
@@ -585,53 +581,41 @@ data Options = Options
585 -- the constructor tag. If 'False' the encoding will always
581 -- the constructor tag. If 'False' the encoding will always
586 -- follow the `sumEncoding`.
582 -- follow the `sumEncoding`.
587 , omitNothingFields :: Bool
583 , omitNothingFields :: Bool
588− -- ^ If 'True', record fields with a 'Nothing' value will be
584+ -- ^ If 'True' record fields with a 'Nothing' value will be
589− -- omitted from the resulting object. If 'False', the resulting
585+ -- omitted from the resulting object. If 'False' the resulting
590 -- object will include those fields mapping to @null@.
586 -- object will include those fields mapping to @null@.
592− -- Note that this /does not/ affect parsing: 'Maybe' fields are
593− -- optional regardless of the value of 'omitNothingFields', subject
594− -- to the note below.
596 -- === Note
588 -- === Note
598 -- Setting 'omitNothingFields' to 'True' only affects fields which are of
590 -- Setting 'omitNothingFields' to 'True' only affects fields which are of
599− -- type 'Maybe' /uniformly/ in the 'ToJSON' instance.
591+ -- type 'Maybe' /uniformly/ in the 'ToJSON' or 'FromJSON' instance. In
600− -- In particular, if the type of a field is declared as a type variable, it
592+ -- particular, if the type of a field is declared as a type variable, it
601 -- will not be omitted from the JSON object, unless the field is
593 -- will not be omitted from the JSON object, unless the field is
602 -- specialized upfront in the instance.
594 -- specialized upfront in the instance.
604− -- The same holds for 'Maybe' fields being optional in the 'FromJSON' instance.
606 -- ==== __Example__
596 -- ==== __Example__
608 -- The generic instance for the following type @Fruit@ depends on whether
598 -- The generic instance for the following type @Fruit@ depends on whether
609 -- the instance head is @Fruit a@ or @Fruit (Maybe a)@.
599 -- the instance head is @Fruit a@ or @Fruit (Maybe a)@.
612− -- data Fruit a = Fruit
602+ -- data Fruit a =
613 -- { apples :: a -- A field whose type is a type variable.
603 -- { apples :: a -- A field whose type is a type variable.
614 -- , oranges :: 'Maybe' Int
604 -- , oranges :: 'Maybe' Int
615− -- } deriving 'Generic'
605+ -- }
607+ -- options :: 'Options'
608+ -- options = 'defaultOptions' { 'omitNothingFields' = 'True' }
617 -- -- apples required, oranges optional
610 -- -- apples required, oranges optional
618 -- -- Even if 'Data.Aeson.fromJSON' is then specialized to (Fruit ('Maybe' a)).
611 -- -- Even if 'Data.Aeson.fromJSON' is then specialized to (Fruit ('Maybe' a)).
619− -- instance 'Data.Aeson.FromJSON' a => 'Data.Aeson.FromJSON' (Fruit a)
612+ -- instance 'Data.Aeson.FromJSON' a => 'Data.Aeson.FromJSON' (Fruit a) where
613+ -- 'Data.Aeson.fromJSON' = 'Data.Aeson.genericFromJSON' options
621 -- -- apples optional, oranges optional
615 -- -- apples optional, oranges optional
622 -- -- In this instance, the field apples is uniformly of type ('Maybe' a).
616 -- -- In this instance, the field apples is uniformly of type ('Maybe' a).
623− -- instance 'Data.Aeson.FromJSON' a => 'Data.Aeson.FromJSON' (Fruit ('Maybe' a))
617+ -- instance 'Data.Aeson.FromJSON' a => 'Data.Aeson.FromJSON' (Fruit ('Maybe' a)) where
624− --
618+ -- 'Data.Aeson.fromJSON' = 'Data.Aeson.genericFromJSON' options
625− -- options :: 'Options'
626− -- options = 'defaultOptions' { 'omitNothingFields' = 'True' }
628− -- -- apples always present in the output, oranges is omitted if 'Nothing'
629− -- instance 'Data.Aeson.ToJSON' a => 'Data.Aeson.ToJSON' (Fruit a) where
630− -- 'Data.Aeson.toJSON' = 'Data.Aeson.genericToJSON' options
632− -- -- both apples and oranges are omitted if 'Nothing'
633− -- instance 'Data.Aeson.ToJSON' a => 'Data.Aeson.ToJSON' (Fruit ('Maybe' a)) where
634− -- 'Data.Aeson.toJSON' = 'Data.Aeson.genericToJSON' options
636 , sumEncoding :: SumEncoding
620 , sumEncoding :: SumEncoding
637 -- ^ Specifies how to encode constructors of a sum datatype.
621 -- ^ Specifies how to encode constructors of a sum datatype.