1111
1212#if MIN_VERSION_random(1,3,0)
1313{-# OPTIONS_GHC -Wno-deprecations #-} -- Due to usage of `split`
14+ {-# LANGUAGE TypeData #-}
15+ {-# LANGUAGE TypeFamilies #-}
1416#endif
1517-- | Generate example CBOR given a CDDL specification
1618module Codec.CBOR.Cuddle.CBOR.Gen (generateCBORTerm , generateCBORTerm' ) where
@@ -25,10 +27,10 @@ import Codec.CBOR.Cuddle.CDDL (
2527 Value (.. ),
2628 ValueVariant (.. ),
2729 )
28- import Codec.CBOR.Cuddle.CDDL.CTree (CTree , CTreePhase , CTreeRoot (.. ), PTerm (.. ))
30+ import Codec.CBOR.Cuddle.CDDL.CTree (CTree ( .. ) , CTreeRoot (.. ), PTerm (.. ), foldCTree )
2931import Codec.CBOR.Cuddle.CDDL.CTree qualified as CTree
3032import Codec.CBOR.Cuddle.CDDL.CtlOp qualified as CtlOp
31- import Codec.CBOR.Cuddle.CDDL.Resolve (MonoRef (.. ), MonoReferenced )
33+ import Codec.CBOR.Cuddle.CDDL.Resolve (MonoReferenced , XXCTree (.. ))
3234import Codec.CBOR.Term (Term (.. ))
3335import Codec.CBOR.Term qualified as CBOR
3436import Codec.CBOR.Write qualified as CBOR
@@ -60,8 +62,20 @@ import System.Random.Stateful (
6062 SplitGen (.. )
6163 )
6264import Codec.CBOR.Cuddle.CDDL.CBORGenerator (WrappedTerm (.. ))
65+ import Codec.CBOR.Cuddle.IndexMappable (IndexMappable (.. ))
6366#endif
6467
68+ type data MonoDropGen
69+
70+ newtype instance XXCTree MonoDropGen = MDGRef Name
71+ deriving (Show )
72+
73+ instance IndexMappable CTree MonoReferenced MonoDropGen where
74+ mapIndex = foldCTree mapExt mapIndex
75+ where
76+ mapExt (MRuleRef n) = CTreeE $ MDGRef n
77+ mapExt (MGenerator _ x) = mapIndex x
78+
6579--------------------------------------------------------------------------------
6680-- Generator infrastructure
6781--------------------------------------------------------------------------------
@@ -233,6 +247,9 @@ pairTermList [] = Just []
233247pairTermList (P x y : xs) = ((x, y) : ) <$> pairTermList xs
234248pairTermList _ = Nothing
235249
250+ showDropGen :: CTree MonoReferenced -> String
251+ showDropGen = show . mapIndex @ _ @ _ @ MonoDropGen
252+
236253--------------------------------------------------------------------------------
237254-- Generator functions
238255--------------------------------------------------------------------------------
@@ -270,9 +287,9 @@ genForCTree (CTree.KV key value _cut) = do
270287 _ ->
271288 error $
272289 " Non single-term generated outside of group context: "
273- <> show key
290+ <> showDropGen key
274291 <> " => "
275- <> show value
292+ <> showDropGen value
276293genForCTree (CTree. Occur item occurs) =
277294 applyOccurenceIndicator occurs (genForCTree item)
278295genForCTree (CTree. Range from to _bounds) = do
@@ -292,11 +309,11 @@ genForCTree (CTree.Control op target controller) = do
292309 (CtlOp. Le , CTree. Literal (Value (VUInt n) _)) -> case target of
293310 CTree. Postlude PTUInt -> S . TInteger <$> genUniformRM (0 , fromIntegral n)
294311 _ -> error " Cannot apply le operator to target"
295- (CtlOp. Le , _) -> error $ " Invalid controller for .le operator: " <> show controller
312+ (CtlOp. Le , _) -> error $ " Invalid controller for .le operator: " <> showDropGen controller
296313 (CtlOp. Lt , CTree. Literal (Value (VUInt n) _)) -> case target of
297314 CTree. Postlude PTUInt -> S . TInteger <$> genUniformRM (0 , fromIntegral n - 1 )
298315 _ -> error " Cannot apply lt operator to target"
299- (CtlOp. Lt , _) -> error $ " Invalid controller for .lt operator: " <> show controller
316+ (CtlOp. Lt , _) -> error $ " Invalid controller for .lt operator: " <> showDropGen controller
300317 (CtlOp. Size , CTree. Literal (Value (VUInt n) _)) -> case target of
301318 CTree. Postlude PTText -> S . TString <$> genText (fromIntegral n)
302319 CTree. Postlude PTBytes -> S . TBytes <$> genBytes (fromIntegral n)
@@ -314,15 +331,15 @@ genForCTree (CTree.Control op target controller) = do
314331 CTree. Postlude PTUInt ->
315332 S . TInteger
316333 <$> genUniformRM (fromIntegral f1, fromIntegral t1)
317- _ -> error $ " Cannot apply size operator to target: " <> show target
334+ _ -> error $ " Cannot apply size operator to target: " <> showDropGen target
318335 _ ->
319336 error $
320337 " Invalid controller for .size operator: "
321- <> show controller
338+ <> showDropGen controller
322339 (CtlOp. Size , _) ->
323340 error $
324341 " Invalid controller for .size operator: "
325- <> show controller
342+ <> showDropGen controller
326343 (CtlOp. Cbor , _) -> do
327344 enc <- genForCTree controller
328345 case enc of
@@ -356,6 +373,7 @@ resolveRef (MRuleRef n) = do
356373 case Map. lookup n cddl of
357374 Nothing -> error $ " Unbound reference: " <> show n
358375 Just val -> pure val
376+ resolveRef (MGenerator _ _) = undefined
359377
360378-- | Generate a CBOR Term corresponding to a top-level name.
361379--
@@ -365,7 +383,7 @@ resolveRef (MRuleRef n) = do
365383-- This will throw an error if the generated item does not correspond to a
366384-- single CBOR term (e.g. if the name resolves to a group, which cannot be
367385-- generated outside a context).
368- genForName :: RandomGen g => Name CTreePhase -> M g Term
386+ genForName :: RandomGen g => Name -> M g Term
369387genForName n = do
370388 (CTreeRoot cddl) <- ask @ " cddl"
371389 case Map. lookup n cddl of
@@ -419,13 +437,13 @@ genValueVariant (VBool b) = pure $ TBool b
419437-- Generator functions
420438--------------------------------------------------------------------------------
421439
422- generateCBORTerm :: RandomGen g => CTreeRoot MonoReferenced -> Name CTreePhase -> g -> Term
440+ generateCBORTerm :: RandomGen g => CTreeRoot MonoReferenced -> Name -> g -> Term
423441generateCBORTerm cddl n stdGen =
424442 let genEnv = GenEnv {cddl}
425443 genState = GenState {randomSeed = stdGen, depth = 1 }
426444 in evalGen (genForName n) genEnv genState
427445
428- generateCBORTerm' :: RandomGen g => CTreeRoot MonoReferenced -> Name CTreePhase -> g -> (Term , g )
446+ generateCBORTerm' :: RandomGen g => CTreeRoot MonoReferenced -> Name -> g -> (Term , g )
429447generateCBORTerm' cddl n stdGen =
430448 let genEnv = GenEnv {cddl}
431449 genState = GenState {randomSeed = stdGen, depth = 1 }
0 commit comments