Skip to content

Commit 8c2caac

Browse files
committed
Updated Validator and Gen
1 parent 5748c6f commit 8c2caac

File tree

5 files changed

+210
-125
lines changed

5 files changed

+210
-125
lines changed

.github/workflows/ci.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ jobs:
7272

7373
- name: Install fourmolu
7474
run: |
75-
FOURMOLU_VERSION="0.14.0.0"
75+
FOURMOLU_VERSION="0.18.0.0"
7676
mkdir -p "$HOME/.local/bin"
7777
curl -sL "https://github.com/fourmolu/fourmolu/releases/download/v${FOURMOLU_VERSION}/fourmolu-${FOURMOLU_VERSION}-linux-x86_64" -o "$HOME/.local/bin/fourmolu"
7878
chmod a+x "$HOME/.local/bin/fourmolu"

src/Codec/CBOR/Cuddle/CBOR/Gen.hs

Lines changed: 39 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,11 @@ import Codec.CBOR.Cuddle.CDDL (
2525
Value (..),
2626
ValueVariant (..),
2727
)
28-
import Codec.CBOR.Cuddle.CDDL.CTree (CTree, CTreeRoot' (..))
28+
import Codec.CBOR.Cuddle.CDDL.CTree (CTree, CTreeRoot (..))
2929
import Codec.CBOR.Cuddle.CDDL.CTree qualified as CTree
3030
import Codec.CBOR.Cuddle.CDDL.CtlOp qualified as CtlOp
3131
import Codec.CBOR.Cuddle.CDDL.Postlude (PTerm (..))
32-
import Codec.CBOR.Cuddle.CDDL.Resolve (MonoRef (..))
32+
import Codec.CBOR.Cuddle.CDDL.Resolve (MonoRef (..), MonoReferenced)
3333
import Codec.CBOR.Term (Term (..))
3434
import Codec.CBOR.Term qualified as CBOR
3535
import Codec.CBOR.Write qualified as CBOR
@@ -41,7 +41,6 @@ import Data.Bifunctor (second)
4141
import Data.ByteString (ByteString)
4242
import Data.ByteString.Base16 qualified as Base16
4343
import Data.Functor ((<&>))
44-
import Data.Functor.Identity (Identity (runIdentity))
4544
import Data.List.NonEmpty qualified as NE
4645
import Data.Map.Strict qualified as Map
4746
import Data.Maybe (fromMaybe)
@@ -69,7 +68,7 @@ import System.Random.Stateful (
6968

7069
-- | Generator context, parametrised over the type of the random seed
7170
newtype GenEnv = GenEnv
72-
{ cddl :: CTreeRoot' Identity MonoRef
71+
{ cddl :: CTreeRoot MonoReferenced
7372
}
7473
deriving (Generic)
7574

@@ -121,8 +120,8 @@ newtype M g a = M {runM :: StateT (GenState g) (Reader GenEnv) a}
121120
()
122121
(MonadState (StateT (GenState g) (Reader GenEnv)))
123122
deriving
124-
( HasSource "cddl" (CTreeRoot' Identity MonoRef)
125-
, HasReader "cddl" (CTreeRoot' Identity MonoRef)
123+
( HasSource "cddl" (CTreeRoot MonoReferenced)
124+
, HasReader "cddl" (CTreeRoot MonoReferenced)
126125
)
127126
via Field
128127
"cddl"
@@ -253,11 +252,11 @@ pattern G xs = GroupTerm xs
253252
-- Generator functions
254253
--------------------------------------------------------------------------------
255254

256-
genForCTree :: RandomGen g => CTree MonoRef -> M g WrappedTerm
255+
genForCTree :: RandomGen g => CTree MonoReferenced -> M g WrappedTerm
257256
genForCTree (CTree.Literal v) = S <$> genValue v
258257
genForCTree (CTree.Postlude pt) = S <$> genPostlude pt
259258
genForCTree (CTree.Map nodes) = do
260-
items <- pairTermList . flattenWrappedList <$> traverse genForNode nodes
259+
items <- pairTermList . flattenWrappedList <$> traverse genForCTree nodes
261260
case items of
262261
Just ts ->
263262
let
@@ -270,17 +269,17 @@ genForCTree (CTree.Map nodes) = do
270269
pure . S $ TMap tsNodup
271270
Nothing -> error "Single terms in map context"
272271
genForCTree (CTree.Array nodes) = do
273-
items <- singleTermList . flattenWrappedList <$> traverse genForNode nodes
272+
items <- singleTermList . flattenWrappedList <$> traverse genForCTree nodes
274273
case items of
275274
Just ts -> pure . S $ TList ts
276275
Nothing -> error "Something weird happened which shouldn't be possible"
277276
genForCTree (CTree.Choice (NE.toList -> nodes)) = do
278277
ix <- genUniformRM (0, length nodes - 1)
279-
genForNode $ nodes !! ix
280-
genForCTree (CTree.Group nodes) = G <$> traverse genForNode nodes
278+
genForCTree $ nodes !! ix
279+
genForCTree (CTree.Group nodes) = G <$> traverse genForCTree nodes
281280
genForCTree (CTree.KV key value _cut) = do
282-
kg <- genForNode key
283-
vg <- genForNode value
281+
kg <- genForCTree key
282+
vg <- genForCTree value
284283
case (kg, vg) of
285284
(S k, S v) -> pure $ P k v
286285
_ ->
@@ -290,11 +289,11 @@ genForCTree (CTree.KV key value _cut) = do
290289
<> " => "
291290
<> show value
292291
genForCTree (CTree.Occur item occurs) =
293-
applyOccurenceIndicator occurs (genForNode item)
292+
applyOccurenceIndicator occurs (genForCTree item)
294293
genForCTree (CTree.Range from to _bounds) = do
295294
-- TODO Handle bounds correctly
296-
term1 <- genForNode from
297-
term2 <- genForNode to
295+
term1 <- genForCTree from
296+
term2 <- genForCTree to
298297
case (term1, term2) of
299298
(S (TInt a), S (TInt b)) -> genUniformRM (a, b) <&> S . TInt
300299
(S (TInt a), S (TInteger b)) -> genUniformRM (fromIntegral a, b) <&> S . TInteger
@@ -304,27 +303,23 @@ genForCTree (CTree.Range from to _bounds) = do
304303
(S (TDouble a), S (TDouble b)) -> genUniformRM (a, b) <&> S . TDouble
305304
x -> error $ "Cannot apply range operator to non-numeric types: " <> show x
306305
genForCTree (CTree.Control op target controller) = do
307-
tt <- resolveIfRef target
308-
ct <- resolveIfRef controller
309-
case (op, ct) of
310-
(CtlOp.Le, CTree.Literal (Value (VUInt n) _)) -> case tt of
306+
case (op, controller) of
307+
(CtlOp.Le, CTree.Literal (Value (VUInt n) _)) -> case target of
311308
CTree.Postlude PTUInt -> S . TInteger <$> genUniformRM (0, fromIntegral n)
312309
_ -> error "Cannot apply le operator to target"
313310
(CtlOp.Le, _) -> error $ "Invalid controller for .le operator: " <> show controller
314-
(CtlOp.Lt, CTree.Literal (Value (VUInt n) _)) -> case tt of
311+
(CtlOp.Lt, CTree.Literal (Value (VUInt n) _)) -> case target of
315312
CTree.Postlude PTUInt -> S . TInteger <$> genUniformRM (0, fromIntegral n - 1)
316313
_ -> error "Cannot apply lt operator to target"
317314
(CtlOp.Lt, _) -> error $ "Invalid controller for .lt operator: " <> show controller
318-
(CtlOp.Size, CTree.Literal (Value (VUInt n) _)) -> case tt of
315+
(CtlOp.Size, CTree.Literal (Value (VUInt n) _)) -> case target of
319316
CTree.Postlude PTText -> S . TString <$> genText (fromIntegral n)
320317
CTree.Postlude PTBytes -> S . TBytes <$> genBytes (fromIntegral n)
321318
CTree.Postlude PTUInt -> S . TInteger <$> genUniformRM (0, 2 ^ n - 1)
322319
_ -> error "Cannot apply size operator to target "
323320
(CtlOp.Size, CTree.Range {CTree.from, CTree.to}) -> do
324-
f <- resolveIfRef from
325-
t <- resolveIfRef to
326-
case (f, t) of
327-
(CTree.Literal (Value (VUInt f1) _), CTree.Literal (Value (VUInt t1) _)) -> case tt of
321+
case (from, to) of
322+
(CTree.Literal (Value (VUInt f1) _), CTree.Literal (Value (VUInt t1) _)) -> case target of
328323
CTree.Postlude PTText ->
329324
genUniformRM (fromIntegral f1, fromIntegral t1)
330325
>>= (fmap (S . TString) . genText)
@@ -334,7 +329,7 @@ genForCTree (CTree.Control op target controller) = do
334329
CTree.Postlude PTUInt ->
335330
S . TInteger
336331
<$> genUniformRM (fromIntegral f1, fromIntegral t1)
337-
_ -> error $ "Cannot apply size operator to target: " <> show tt
332+
_ -> error $ "Cannot apply size operator to target: " <> show target
338333
_ ->
339334
error $
340335
"Invalid controller for .size operator: "
@@ -344,39 +339,38 @@ genForCTree (CTree.Control op target controller) = do
344339
"Invalid controller for .size operator: "
345340
<> show controller
346341
(CtlOp.Cbor, _) -> do
347-
enc <- genForCTree ct
342+
enc <- genForCTree controller
348343
case enc of
349344
S x -> pure . S . TBytes . CBOR.toStrictByteString $ CBOR.encodeTerm x
350345
_ -> error "Controller does not correspond to a single term"
351-
_ -> genForNode target
352-
genForCTree (CTree.Enum node) = do
353-
tree <- resolveIfRef node
346+
_ -> genForCTree target
347+
genForCTree (CTree.Enum tree) = do
354348
case tree of
355-
CTree.Group nodes -> do
356-
ix <- genUniformRM (0, length nodes)
357-
genForNode $ nodes !! ix
349+
CTree.Group trees -> do
350+
ix <- genUniformRM (0, length trees)
351+
genForCTree $ trees !! ix
358352
_ -> error "Attempt to form an enum from something other than a group"
359-
genForCTree (CTree.Unwrap node) = genForCTree =<< resolveIfRef node
353+
genForCTree (CTree.Unwrap node) = genForCTree node
360354
genForCTree (CTree.Tag tag node) = do
361-
enc <- genForNode node
355+
enc <- genForCTree node
362356
case enc of
363357
S x -> pure $ S $ TTagged tag x
364358
_ -> error "Tag controller does not correspond to a single term"
359+
genForCTree (CTree.CTreeE x) = genForNode x
365360

366-
genForNode :: RandomGen g => CTree.Node MonoRef -> M g WrappedTerm
367-
genForNode = genForCTree <=< resolveIfRef
361+
genForNode :: RandomGen g => CTree.Node MonoReferenced -> M g WrappedTerm
362+
genForNode = genForCTree <=< resolveRef
368363

369364
-- | Take something which might be a reference and resolve it to the relevant
370365
-- Tree, following multiple links if necessary.
371-
resolveIfRef :: RandomGen g => CTree.Node MonoRef -> M g (CTree MonoRef)
372-
resolveIfRef (MIt a) = pure a
373-
resolveIfRef (MRuleRef n) = do
366+
resolveRef :: RandomGen g => CTree.Node MonoReferenced -> M g (CTree MonoReferenced)
367+
resolveRef (MRuleRef n) = do
374368
(CTreeRoot cddl) <- ask @"cddl"
375369
-- Since we follow a reference, we increase the 'depth' of the gen monad.
376370
modify @"depth" (+ 1)
377371
case Map.lookup n cddl of
378372
Nothing -> error $ "Unbound reference: " <> show n
379-
Just val -> resolveIfRef $ runIdentity val
373+
Just val -> pure val
380374

381375
-- | Generate a CBOR Term corresponding to a top-level name.
382376
--
@@ -392,7 +386,7 @@ genForName n = do
392386
case Map.lookup n cddl of
393387
Nothing -> error $ "Unbound reference: " <> show n
394388
Just val ->
395-
genForNode (runIdentity val) >>= \case
389+
genForCTree val >>= \case
396390
S x -> pure x
397391
_ ->
398392
error $
@@ -440,13 +434,13 @@ genValueVariant (VBool b) = pure $ TBool b
440434
-- Generator functions
441435
--------------------------------------------------------------------------------
442436

443-
generateCBORTerm :: RandomGen g => CTreeRoot' Identity MonoRef -> Name -> g -> Term
437+
generateCBORTerm :: RandomGen g => CTreeRoot MonoReferenced -> Name -> g -> Term
444438
generateCBORTerm cddl n stdGen =
445439
let genEnv = GenEnv {cddl}
446440
genState = GenState {randomSeed = stdGen, depth = 1}
447441
in evalGen (genForName n) genEnv genState
448442

449-
generateCBORTerm' :: RandomGen g => CTreeRoot' Identity MonoRef -> Name -> g -> (Term, g)
443+
generateCBORTerm' :: RandomGen g => CTreeRoot MonoReferenced -> Name -> g -> (Term, g)
450444
generateCBORTerm' cddl n stdGen =
451445
let genEnv = GenEnv {cddl}
452446
genState = GenState {randomSeed = stdGen, depth = 1}

0 commit comments

Comments
 (0)