-
Notifications
You must be signed in to change notification settings - Fork 321
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Could not deduce RecordFromJSON'
and RecordToPairs
in aeson-2.2.0.0
#1059
Comments
The behavior has changed. If encoded as record, encoding instance ( Selector s
- , GToJSON' enc arity a
+ , GToJSON' enc arity (K1 i t)
, KeyValuePair enc pairs
- ) => RecordToPairs enc pairs arity (S1 s a)
+ , ToJSON t
+ ) => RecordToPairs enc pairs arity (S1 s (K1 i t))
where
- recordToPairs = fieldToPair
+ recordToPairs opts targs m1
+ | omitNothingFields opts
+ , omitField (unK1 $ unM1 m1 :: t)
+ = mempty
+
+ | otherwise =
+ let key = Key.fromString $ fieldLabelModifier opts (selName m1)
+ value = gToJSON opts targs (unM1 m1)
+ in key `pair` value and two other Note, that we need to do Probably we'd need to add one more auxiliary class (say I have no idea how to do that, but as long as above test case is added as an regression test, and nothing else in test-suite needs to be changed I'll be happy to review the patch. |
Alright, I understand. Unfortunately, I currently have neither the necessary insight and experience, nor the time to work on a patch for this. I will make do with the basic |
The error messages changed, but this should convey the idea. This may be related to haskell/aeson#1059 The commit history is still very messy, but in any event: src/Cardano/Report.hs:341:30: error: • Could not deduce (ToJSON (CDFList f1 (DataDomain I SlotNo))) arising from a use of ‘renderAnalysisCDFs’ from the context: (&) KnownCDF ToJSON1 f bound by a pattern with constructor: SomeSummary :: forall (cls :: (* -> *) -> Constraint) (f :: * -> *). cls f => Summary f -> SomeSummary cls, in an equation for ‘generate'’ at src/Cardano/Report.hs:279:21-51 or from: KnownCDF f1 bound by a pattern with constructor: SomeBlockProp :: forall (f :: * -> *). KnownCDF f => BlockProp f -> SomeBlockProp, in an equation for ‘generate'’ at src/Cardano/Report.hs:279:65-99 • In the expression: renderAnalysisCDFs anchor (dFields bpFieldsControl) OfInterCDF Nothing renderConfig bp In an equation for ‘anomalyRendering’: anomalyRendering anchor = renderAnalysisCDFs anchor (dFields bpFieldsControl) OfInterCDF Nothing renderConfig bp In an equation for ‘generate'’: generate' baseline@(SomeSummary (summ :: Summary f), cp :: cpt, SomeBlockProp (bp :: BlockProp bpt)) rest = do ctx <- getReport metas (last restTmpls & trManifest & getComponent "cardano-node" & ciVersion) time <- getCurrentTime _ <- pure $ mkTmplEnv ctx (liftTmplRun summ) $ fmap ((\ (SomeSummary ss) -> liftTmplRun ss) . fst3) rest .... where resourceText = unlines resourceLines anomalyText = unlines anomalyLines forgingText = unlines forgingLines peersText = unlines peersLines .... | 341 | anomalyRendering anchor = renderAnalysisCDFs anchor (dFields bpFieldsControl) OfInterCDF Nothing renderConfig bp | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ src/Cardano/Report.hs:341:30: error: • Could not deduce (ToJSON (f1 a)) arising from a use of ‘renderAnalysisCDFs’ from the context: (&) KnownCDF ToJSON1 f bound by a pattern with constructor: SomeSummary :: forall (cls :: (* -> *) -> Constraint) (f :: * -> *). cls f => Summary f -> SomeSummary cls, in an equation for ‘generate'’ at src/Cardano/Report.hs:279:21-51 or from: KnownCDF f1 bound by a pattern with constructor: SomeBlockProp :: forall (f :: * -> *). KnownCDF f => BlockProp f -> SomeBlockProp, in an equation for ‘generate'’ at src/Cardano/Report.hs:279:65-99 or from: ToJSON a bound by a quantified context at src/Cardano/Report.hs:1:1 • In the expression: renderAnalysisCDFs anchor (dFields bpFieldsControl) OfInterCDF Nothing renderConfig bp In an equation for ‘anomalyRendering’: anomalyRendering anchor = renderAnalysisCDFs anchor (dFields bpFieldsControl) OfInterCDF Nothing renderConfig bp In an equation for ‘generate'’: generate' baseline@(SomeSummary (summ :: Summary f), cp :: cpt, SomeBlockProp (bp :: BlockProp bpt)) rest = do ctx <- getReport metas (last restTmpls & trManifest & getComponent "cardano-node" & ciVersion) time <- getCurrentTime _ <- pure $ mkTmplEnv ctx (liftTmplRun summ) $ fmap ((\ (SomeSummary ss) -> liftTmplRun ss) . fst3) rest .... where resourceText = unlines resourceLines anomalyText = unlines anomalyLines forgingText = unlines forgingLines peersText = unlines peersLines .... | 341 | anomalyRendering anchor = renderAnalysisCDFs anchor (dFields bpFieldsControl) OfInterCDF Nothing renderConfig bp | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: cabal: Failed to build locli-1.34 (which is required by exe:locli from locli-1.34).
The error messages changed, but this should convey the idea. This may be related to haskell/aeson#1059 The commit history is still very messy, but in any event: src/Cardano/Report.hs:341:30: error: • Could not deduce (ToJSON (CDFList f1 (DataDomain I SlotNo))) arising from a use of ‘renderAnalysisCDFs’ from the context: (&) KnownCDF ToJSON1 f bound by a pattern with constructor: SomeSummary :: forall (cls :: (* -> *) -> Constraint) (f :: * -> *). cls f => Summary f -> SomeSummary cls, in an equation for ‘generate'’ at src/Cardano/Report.hs:279:21-51 or from: KnownCDF f1 bound by a pattern with constructor: SomeBlockProp :: forall (f :: * -> *). KnownCDF f => BlockProp f -> SomeBlockProp, in an equation for ‘generate'’ at src/Cardano/Report.hs:279:65-99 • In the expression: renderAnalysisCDFs anchor (dFields bpFieldsControl) OfInterCDF Nothing renderConfig bp In an equation for ‘anomalyRendering’: anomalyRendering anchor = renderAnalysisCDFs anchor (dFields bpFieldsControl) OfInterCDF Nothing renderConfig bp In an equation for ‘generate'’: generate' baseline@(SomeSummary (summ :: Summary f), cp :: cpt, SomeBlockProp (bp :: BlockProp bpt)) rest = do ctx <- getReport metas (last restTmpls & trManifest & getComponent "cardano-node" & ciVersion) time <- getCurrentTime _ <- pure $ mkTmplEnv ctx (liftTmplRun summ) $ fmap ((\ (SomeSummary ss) -> liftTmplRun ss) . fst3) rest .... where resourceText = unlines resourceLines anomalyText = unlines anomalyLines forgingText = unlines forgingLines peersText = unlines peersLines .... | 341 | anomalyRendering anchor = renderAnalysisCDFs anchor (dFields bpFieldsControl) OfInterCDF Nothing renderConfig bp | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ src/Cardano/Report.hs:341:30: error: • Could not deduce (ToJSON (f1 a)) arising from a use of ‘renderAnalysisCDFs’ from the context: (&) KnownCDF ToJSON1 f bound by a pattern with constructor: SomeSummary :: forall (cls :: (* -> *) -> Constraint) (f :: * -> *). cls f => Summary f -> SomeSummary cls, in an equation for ‘generate'’ at src/Cardano/Report.hs:279:21-51 or from: KnownCDF f1 bound by a pattern with constructor: SomeBlockProp :: forall (f :: * -> *). KnownCDF f => BlockProp f -> SomeBlockProp, in an equation for ‘generate'’ at src/Cardano/Report.hs:279:65-99 or from: ToJSON a bound by a quantified context at src/Cardano/Report.hs:1:1 • In the expression: renderAnalysisCDFs anchor (dFields bpFieldsControl) OfInterCDF Nothing renderConfig bp In an equation for ‘anomalyRendering’: anomalyRendering anchor = renderAnalysisCDFs anchor (dFields bpFieldsControl) OfInterCDF Nothing renderConfig bp In an equation for ‘generate'’: generate' baseline@(SomeSummary (summ :: Summary f), cp :: cpt, SomeBlockProp (bp :: BlockProp bpt)) rest = do ctx <- getReport metas (last restTmpls & trManifest & getComponent "cardano-node" & ciVersion) time <- getCurrentTime _ <- pure $ mkTmplEnv ctx (liftTmplRun summ) $ fmap ((\ (SomeSummary ss) -> liftTmplRun ss) . fst3) rest .... where resourceText = unlines resourceLines anomalyText = unlines anomalyLines forgingText = unlines forgingLines peersText = unlines peersLines .... | 341 | anomalyRendering anchor = renderAnalysisCDFs anchor (dFields bpFieldsControl) OfInterCDF Nothing renderConfig bp | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: cabal: Failed to build locli-1.34 (which is required by exe:locli from locli-1.34).
The error messages changed, but this should convey the idea. This may be related to haskell/aeson#1059 The commit history is still very messy, but in any event: src/Cardano/Report.hs:341:30: error: • Could not deduce (ToJSON (CDFList f1 (DataDomain I SlotNo))) arising from a use of ‘renderAnalysisCDFs’ from the context: (&) KnownCDF ToJSON1 f bound by a pattern with constructor: SomeSummary :: forall (cls :: (* -> *) -> Constraint) (f :: * -> *). cls f => Summary f -> SomeSummary cls, in an equation for ‘generate'’ at src/Cardano/Report.hs:279:21-51 or from: KnownCDF f1 bound by a pattern with constructor: SomeBlockProp :: forall (f :: * -> *). KnownCDF f => BlockProp f -> SomeBlockProp, in an equation for ‘generate'’ at src/Cardano/Report.hs:279:65-99 • In the expression: renderAnalysisCDFs anchor (dFields bpFieldsControl) OfInterCDF Nothing renderConfig bp In an equation for ‘anomalyRendering’: anomalyRendering anchor = renderAnalysisCDFs anchor (dFields bpFieldsControl) OfInterCDF Nothing renderConfig bp In an equation for ‘generate'’: generate' baseline@(SomeSummary (summ :: Summary f), cp :: cpt, SomeBlockProp (bp :: BlockProp bpt)) rest = do ctx <- getReport metas (last restTmpls & trManifest & getComponent "cardano-node" & ciVersion) time <- getCurrentTime _ <- pure $ mkTmplEnv ctx (liftTmplRun summ) $ fmap ((\ (SomeSummary ss) -> liftTmplRun ss) . fst3) rest .... where resourceText = unlines resourceLines anomalyText = unlines anomalyLines forgingText = unlines forgingLines peersText = unlines peersLines .... | 341 | anomalyRendering anchor = renderAnalysisCDFs anchor (dFields bpFieldsControl) OfInterCDF Nothing renderConfig bp | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ src/Cardano/Report.hs:341:30: error: • Could not deduce (ToJSON (f1 a)) arising from a use of ‘renderAnalysisCDFs’ from the context: (&) KnownCDF ToJSON1 f bound by a pattern with constructor: SomeSummary :: forall (cls :: (* -> *) -> Constraint) (f :: * -> *). cls f => Summary f -> SomeSummary cls, in an equation for ‘generate'’ at src/Cardano/Report.hs:279:21-51 or from: KnownCDF f1 bound by a pattern with constructor: SomeBlockProp :: forall (f :: * -> *). KnownCDF f => BlockProp f -> SomeBlockProp, in an equation for ‘generate'’ at src/Cardano/Report.hs:279:65-99 or from: ToJSON a bound by a quantified context at src/Cardano/Report.hs:1:1 • In the expression: renderAnalysisCDFs anchor (dFields bpFieldsControl) OfInterCDF Nothing renderConfig bp In an equation for ‘anomalyRendering’: anomalyRendering anchor = renderAnalysisCDFs anchor (dFields bpFieldsControl) OfInterCDF Nothing renderConfig bp In an equation for ‘generate'’: generate' baseline@(SomeSummary (summ :: Summary f), cp :: cpt, SomeBlockProp (bp :: BlockProp bpt)) rest = do ctx <- getReport metas (last restTmpls & trManifest & getComponent "cardano-node" & ciVersion) time <- getCurrentTime _ <- pure $ mkTmplEnv ctx (liftTmplRun summ) $ fmap ((\ (SomeSummary ss) -> liftTmplRun ss) . fst3) rest .... where resourceText = unlines resourceLines anomalyText = unlines anomalyLines forgingText = unlines forgingLines peersText = unlines peersLines .... | 341 | anomalyRendering anchor = renderAnalysisCDFs anchor (dFields bpFieldsControl) OfInterCDF Nothing renderConfig bp | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Error: cabal: Failed to build locli-1.34 (which is required by exe:locli from locli-1.34).
I have been using aeson 2.1.2.1 for a while now to avoid this issue. However, it seems to be incompatible with newer versions of GHC due to the version bounds on First of all, I am surprised that nobody else seems to be running into this issue (no activity on this ticket in almost a year). My original example was quite contrived, but I have since encountered this problem many times. This includes very simple situations like: newtype Test a = Test { items :: Maybe [a] } deriving (Generic1, FromJSON1, ToJSON1) I am also surprised that this seems to not have cropped up during the original development of the optional fields feature in #1023 and #1039. I managed to get the parsing side of things working by adding the following instance: instance {-# OVERLAPPING #-}
(Selector s, GFromJSON One (Rec1 g), FromJSON1 f, FromJSON1 g) =>
RecordFromJSON' One (S1 s (f :.: Rec1 g)) where
recordParseJSON' args@(_ :* _ :* opts :* From1Args o _ _) obj = recordParseJSONImpl d gParseJSON args obj where
d = guard (allowOmittedFields opts) >> fmap Comp1 (liftOmittedField (fmap Rec1 (liftOmittedField o)))
{-# INLINE recordParseJSON' #-} However, I am not quite understanding what is going on here and I have no idea if this covers all cases. As an aside, this implementation makes use of the -- Note: the ommitedField is not passed here.
-- This might be related for :.: associated the wrong way in Generics Rep. It also seems like the |
Since #1103 did not cover all cases, I did some more digging. It seems like the reason this no longer works is this change from #1039 where instead of a single instance: RecordFromJSON' arity (S1 s a) There are now several instances: RecordFromJSON' arity (S1 s (K1 i a))
RecordFromJSON' arity (S1 s (Rec0 a))
RecordFromJSON' One (S1 s (Rec1 f))
RecordFromJSON' One (S1 s Par1) An instance involving Unfortunately, I do not understand what @phadej had in mind with the
class GFromJSON arity f where
gParseJSON :: Options -> FromArgs arity a -> Value -> Parser (f a)
+ gOmittedField :: FromArgs arity a -> Maybe (f a)
+class GOmitFromJSON arity f where
+ gOmittedField :: FromArgs arity a -> Maybe (f a) In both cases, the Approach 1 has the advantage of not introducing any new type classes. However, it requires implementing the Any thoughts on this? Do people have a preference for one approach over the other? |
I have the following code
With
aeson-2.1.2.1
, this code works perfectly fine. Withaeson-2.2.0.0
, I get the following errors:I looked at the changelog, and while there have apparently been some changes to the handling of Generics related to omitted fields, I did not find anything that would indicate that my situation should no longer work. Is this a regression or am I doing something wrong?
The text was updated successfully, but these errors were encountered: