@@ -32,6 +32,7 @@ import qualified Control.Monad.State as S
32import Data.Aeson
32import Data.Aeson
33import Data.Aeson.Types (Parser)
33import Data.Aeson.Types (Parser)
34import Data.Constraint
34import Data.Constraint
35+import Data.Maybe (catMaybes)
35import Data.Proxy
36import Data.Proxy
36import qualified Data.Text as T
37import qualified Data.Text as T
37import Data.Typeable
38import Data.Typeable
@@ -115,7 +116,7 @@ instance RecEq lts lts => Eq (Rec lts) where
116#ifdef WITH_AESON
117#ifdef WITH_AESON
118− ( RecApply lts lts ToJSON
119+ ( RecApply lts lts EncodeField
120 ToJSON (Rec lts)
121 ToJSON (Rec lts)
@@ -124,6 +125,7 @@ instance
125instance (RecSize lts ~ s, KnownNat s, RecJsonParse lts) => FromJSON (Rec lts) where
126instance (RecSize lts ~ s, KnownNat s, RecJsonParse lts) => FromJSON (Rec lts) where
126 parseJSON = recJsonParser defaultJSONOptions
127 parseJSON = recJsonParser defaultJSONOptions
129instance RecNfData lts lts => NFData (Rec lts) where
131instance RecNfData lts lts => NFData (Rec lts) where
@@ -552,13 +554,26 @@ reflectRecFold _ f r =
552showRec :: forall lts. (RecApply lts lts Show) => Rec lts -> [(String, String)]
554showRec :: forall lts. (RecApply lts lts Show) => Rec lts -> [(String, String)]
553showRec = reflectRec @Show Proxy (\k v -> (k, show v))
555showRec = reflectRec @Show Proxy (\k v -> (k, show v))
557+class ToJSON a => EncodeField a where
558+ encodeField :: a -> Maybe Value
559+ encodeKV :: T.Text -> a -> Series
561+instance ToJSON a => EncodeField a where
562+ encodeField = pure . toJSON
565+instance {-# OVERLAPS #-} ToJSON a => EncodeField (Maybe a) where
566+ encodeField = fmap toJSON
567+ encodeKV _ Nothing = mempty
568+ encodeKV k v = k .= v
555−recToValue :: forall lts. (RecApply lts lts ToJSON) => JSONOptions -> Rec lts -> Value
570+recToValue :: forall lts. (RecApply lts lts EncodeField) => JSONOptions -> Rec lts -> Value
556recToValue options r =
571recToValue options r =
557− object $ reflectRec @ToJSON Proxy (\k v -> (T.pack (fieldTransform options k), toJSON v)) r
572+ object $ catMaybes $ reflectRec @EncodeField Proxy (\k v -> (T.pack (fieldTransform options k),) <$> encodeField v) r
559−recToEncoding :: forall lts. (RecApply lts lts ToJSON) => JSONOptions -> Rec lts -> Encoding
574+recToEncoding :: forall lts. (RecApply lts lts EncodeField) => JSONOptions -> Rec lts -> Encoding
560recToEncoding options r =
575recToEncoding options r =
561− pairs $ mconcat $ reflectRec @ToJSON Proxy (\k v -> (T.pack (fieldTransform options k) .= v)) r
576+ pairs $ mconcat $ reflectRec @EncodeField Proxy (\k v -> (T.pack (fieldTransform options k) `encodeKV` v)) r
563recJsonParser ::
578recJsonParser ::
564 forall lts s.
579 forall lts s.