Skip to content

Commit c337e76

Browse files
committed
Added extensions to CDDL AST
1 parent 8b4241e commit c337e76

File tree

20 files changed

+1022
-531
lines changed

20 files changed

+1022
-531
lines changed

CHANGELOG.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,12 @@
22

33
## 1.1.0.0
44

5+
* Change the order of fields in `GroupEntry`; the extension field is now the last field
6+
* Add `IndexMappable` to help with traversing `CDDL` trees
7+
* Add an index type parameter to all `CDDL` terms
8+
* Remove `Codec.CBOR.Cuddle.CDDL.Prelude`
9+
* Replace `cddlPrelude` with `cddlPostlude`, `prependPrelude` with `appendPostlude`
10+
* Move `PTerm` to `Codec.CBOR.Cuddle.CDDL.CTree`
511
* Remove `CTreeRoot'`
612
* Changed the type in `CTreeRoot` to a map of resolved `CTree`s
713
* Changed the type of the first argument for `generateCBORTerm` and

bin/Main.hs

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,13 +4,14 @@ module Main (main) where
44

55
import Codec.CBOR.Cuddle.CBOR.Gen (generateCBORTerm)
66
import Codec.CBOR.Cuddle.CBOR.Validator
7-
import Codec.CBOR.Cuddle.CDDL (Name (..), sortCDDL)
8-
import Codec.CBOR.Cuddle.CDDL.Prelude (prependPrelude)
7+
import Codec.CBOR.Cuddle.CDDL (Name (..), fromRules, sortCDDL)
8+
import Codec.CBOR.Cuddle.CDDL.Postlude (appendPostlude)
99
import Codec.CBOR.Cuddle.CDDL.Resolve (
1010
fullResolveCDDL,
1111
)
12+
import Codec.CBOR.Cuddle.IndexMappable (IndexMappable (..))
1213
import Codec.CBOR.Cuddle.Parser (pCDDL)
13-
import Codec.CBOR.Cuddle.Pretty ()
14+
import Codec.CBOR.Cuddle.Pretty (PrettyStage)
1415
import Codec.CBOR.FlatTerm (toFlatTerm)
1516
import Codec.CBOR.Pretty (prettyHexEnc)
1617
import Codec.CBOR.Term (encodeTerm)
@@ -185,26 +186,26 @@ run (Opts cmd cddlFile) = do
185186
Format fOpts ->
186187
let
187188
defs
188-
| sort fOpts = sortCDDL res
189+
| sort fOpts = fromRules $ sortCDDL res
189190
| otherwise = res
190191
in
191-
putDocW 80 $ pretty defs
192+
putDocW 80 . pretty $ mapIndex @_ @_ @PrettyStage defs
192193
Validate vOpts ->
193194
let
194195
res'
195196
| vNoPrelude vOpts = res
196-
| otherwise = prependPrelude res
197+
| otherwise = appendPostlude res
197198
in
198-
case fullResolveCDDL res' of
199+
case fullResolveCDDL $ mapIndex res' of
199200
Left err -> putStrLnErr (show err) >> exitFailure
200201
Right _ -> exitSuccess
201202
(GenerateCBOR gOpts) ->
202203
let
203204
res'
204205
| gNoPrelude gOpts = res
205-
| otherwise = prependPrelude res
206+
| otherwise = appendPostlude res
206207
in
207-
case fullResolveCDDL res' of
208+
case fullResolveCDDL $ mapIndex res' of
208209
Left err -> putStrLnErr (show err) >> exitFailure
209210
Right mt -> do
210211
stdGen <- getStdGen
@@ -220,9 +221,9 @@ run (Opts cmd cddlFile) = do
220221
let
221222
res'
222223
| vcNoPrelude vcOpts = res
223-
| otherwise = prependPrelude res
224+
| otherwise = res
224225
in
225-
case fullResolveCDDL res' of
226+
case fullResolveCDDL $ mapIndex res' of
226227
Left err -> putStrLnErr (show err) >> exitFailure
227228
Right mt -> do
228229
cbor <- BSC.readFile (vcInput vcOpts)

cuddle.cabal

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,12 +47,12 @@ library
4747
Codec.CBOR.Cuddle.CDDL.CTree
4848
Codec.CBOR.Cuddle.CDDL.CtlOp
4949
Codec.CBOR.Cuddle.CDDL.Postlude
50-
Codec.CBOR.Cuddle.CDDL.Prelude
5150
Codec.CBOR.Cuddle.CDDL.Resolve
5251
Codec.CBOR.Cuddle.Comments
5352
Codec.CBOR.Cuddle.Huddle
5453
Codec.CBOR.Cuddle.Huddle.HuddleM
5554
Codec.CBOR.Cuddle.Huddle.Optics
55+
Codec.CBOR.Cuddle.IndexMappable
5656
Codec.CBOR.Cuddle.Parser
5757
Codec.CBOR.Cuddle.Parser.Lexer
5858
Codec.CBOR.Cuddle.Pretty
@@ -149,6 +149,7 @@ test-suite cuddle-test
149149
bytestring,
150150
cuddle,
151151
data-default-class,
152+
generic-random,
152153
hspec >=2.11,
153154
hspec-megaparsec >=2.2,
154155
megaparsec,

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

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,9 @@ 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, CTreePhase, CTreeRoot (..), PTerm (..))
2929
import Codec.CBOR.Cuddle.CDDL.CTree qualified as CTree
3030
import Codec.CBOR.Cuddle.CDDL.CtlOp qualified as CtlOp
31-
import Codec.CBOR.Cuddle.CDDL.Postlude (PTerm (..))
3231
import Codec.CBOR.Cuddle.CDDL.Resolve (MonoRef (..), MonoReferenced)
3332
import Codec.CBOR.Term (Term (..))
3433
import Codec.CBOR.Term qualified as CBOR
@@ -380,7 +379,7 @@ resolveRef (MRuleRef n) = do
380379
-- This will throw an error if the generated item does not correspond to a
381380
-- single CBOR term (e.g. if the name resolves to a group, which cannot be
382381
-- generated outside a context).
383-
genForName :: RandomGen g => Name -> M g Term
382+
genForName :: RandomGen g => Name CTreePhase -> M g Term
384383
genForName n = do
385384
(CTreeRoot cddl) <- ask @"cddl"
386385
case Map.lookup n cddl of
@@ -434,13 +433,13 @@ genValueVariant (VBool b) = pure $ TBool b
434433
-- Generator functions
435434
--------------------------------------------------------------------------------
436435

437-
generateCBORTerm :: RandomGen g => CTreeRoot MonoReferenced -> Name -> g -> Term
436+
generateCBORTerm :: RandomGen g => CTreeRoot MonoReferenced -> Name CTreePhase -> g -> Term
438437
generateCBORTerm cddl n stdGen =
439438
let genEnv = GenEnv {cddl}
440439
genState = GenState {randomSeed = stdGen, depth = 1}
441440
in evalGen (genForName n) genEnv genState
442441

443-
generateCBORTerm' :: RandomGen g => CTreeRoot MonoReferenced -> Name -> g -> (Term, g)
442+
generateCBORTerm' :: RandomGen g => CTreeRoot MonoReferenced -> Name CTreePhase -> g -> (Term, g)
444443
generateCBORTerm' cddl n stdGen =
445444
let genEnv = GenEnv {cddl}
446445
genState = GenState {randomSeed = stdGen, depth = 1}

src/Codec/CBOR/Cuddle/CBOR/Validator.hs

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ module Codec.CBOR.Cuddle.CBOR.Validator (
1010
import Codec.CBOR.Cuddle.CDDL hiding (CDDL, Group, Rule)
1111
import Codec.CBOR.Cuddle.CDDL.CTree
1212
import Codec.CBOR.Cuddle.CDDL.CtlOp
13-
import Codec.CBOR.Cuddle.CDDL.Postlude
1413
import Codec.CBOR.Cuddle.CDDL.Resolve
1514
import Codec.CBOR.Read
1615
import Codec.CBOR.Term
@@ -113,7 +112,7 @@ data AMatchedItem = AMatchedItem
113112
--------------------------------------------------------------------------------
114113
-- Main entry point
115114

116-
validateCBOR :: BS.ByteString -> Name -> CDDL -> IO ()
115+
validateCBOR :: BS.ByteString -> Name CTreePhase -> CDDL -> IO ()
117116
validateCBOR bs rule cddl =
118117
( case validateCBOR' bs rule cddl of
119118
ok@(CBORTermResult _ (Valid _)) -> do
@@ -130,7 +129,7 @@ validateCBOR bs rule cddl =
130129
)
131130

132131
validateCBOR' ::
133-
BS.ByteString -> Name -> CDDL -> CBORTermResult
132+
BS.ByteString -> Name CTreePhase -> CDDL -> CBORTermResult
134133
validateCBOR' bs rule cddl@(CTreeRoot tree) =
135134
case deserialiseFromBytes decodeTerm (BSL.fromStrict bs) of
136135
Left e -> error $ show e

0 commit comments

Comments
 (0)