Skip to content

Commit 2defca0

Browse files
committed
Fixed modules
1 parent e558268 commit 2defca0

File tree

14 files changed

+340
-263
lines changed

14 files changed

+340
-263
lines changed

bin/Main.hs

Lines changed: 27 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,16 @@ 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 (..), fromRules, sortCDDL)
7+
import Codec.CBOR.Cuddle.CDDL (
8+
CDDL (..),
9+
Name (..),
10+
TopLevel (..),
11+
XRule,
12+
XTerm,
13+
XXType2,
14+
fromRules,
15+
sortCDDL,
16+
)
817
import Codec.CBOR.Cuddle.CDDL.Postlude (appendPostlude)
918
import Codec.CBOR.Cuddle.CDDL.Resolve (
1019
fullResolveCDDL,
@@ -177,6 +186,15 @@ main = do
177186

178187
run :: Opts -> IO ()
179188
run (Opts cmd cddlFile) = do
189+
let
190+
mapRule ::
191+
( IndexMappable XXType2 i j
192+
, IndexMappable XTerm i j
193+
, IndexMappable XRule i j
194+
) =>
195+
TopLevel i -> [TopLevel j]
196+
mapRule (TopLevelRule r) = [TopLevelRule $ mapIndex r]
197+
mapRule (XXTopLevel _) = []
180198
parseFromFile pCDDL cddlFile >>= \case
181199
Left err -> do
182200
putStrLnErr $ errorBundlePretty err
@@ -192,24 +210,24 @@ run (Opts cmd cddlFile) = do
192210
putDocW 80 . pretty $ mapIndex @_ @_ @PrettyStage defs
193211
Validate vOpts ->
194212
let
195-
res'
213+
CDDL r tls _
196214
| vNoPrelude vOpts = res
197215
| otherwise = appendPostlude res
198216
in
199-
case fullResolveCDDL $ mapIndex res' of
217+
case fullResolveCDDL $ CDDL (mapIndex r) (foldMap mapRule tls) mempty of
200218
Left err -> putStrLnErr (show err) >> exitFailure
201219
Right _ -> exitSuccess
202220
(GenerateCBOR gOpts) ->
203221
let
204-
res'
222+
CDDL r tls _
205223
| gNoPrelude gOpts = res
206224
| otherwise = appendPostlude res
207225
in
208-
case fullResolveCDDL $ mapIndex res' of
226+
case fullResolveCDDL $ CDDL (mapIndex r) (foldMap mapRule tls) mempty of
209227
Left err -> putStrLnErr (show err) >> exitFailure
210228
Right mt -> do
211229
stdGen <- getStdGen
212-
let term = generateCBORTerm mt (Name (itemName gOpts) mempty) stdGen
230+
let term = generateCBORTerm mt (Name $ itemName gOpts) stdGen
213231
in case outputFormat gOpts of
214232
AsTerm -> print term
215233
AsFlatTerm -> print $ toFlatTerm (encodeTerm term)
@@ -219,15 +237,15 @@ run (Opts cmd cddlFile) = do
219237
AsPrettyCBOR -> putStrLn . prettyHexEnc $ encodeTerm term
220238
ValidateCBOR vcOpts ->
221239
let
222-
res'
240+
CDDL r tls _
223241
| vcNoPrelude vcOpts = res
224242
| otherwise = res
225243
in
226-
case fullResolveCDDL $ mapIndex res' of
244+
case fullResolveCDDL $ CDDL (mapIndex r) (foldMap mapRule tls) mempty of
227245
Left err -> putStrLnErr (show err) >> exitFailure
228246
Right mt -> do
229247
cbor <- BSC.readFile (vcInput vcOpts)
230-
validateCBOR cbor (Name (vcItemName vcOpts) mempty) mt
248+
validateCBOR cbor (Name $ vcItemName vcOpts) (mapIndex mt)
231249

232250
putStrLnErr :: String -> IO ()
233251
putStrLnErr = hPutStrLn stderr

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

Lines changed: 30 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
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
1618
module 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)
2931
import Codec.CBOR.Cuddle.CDDL.CTree qualified as CTree
3032
import 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 (..))
3234
import Codec.CBOR.Term (Term (..))
3335
import Codec.CBOR.Term qualified as CBOR
3436
import Codec.CBOR.Write qualified as CBOR
@@ -60,8 +62,20 @@ import System.Random.Stateful (
6062
SplitGen (..)
6163
)
6264
import 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 []
233247
pairTermList (P x y : xs) = ((x, y) :) <$> pairTermList xs
234248
pairTermList _ = 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
276293
genForCTree (CTree.Occur item occurs) =
277294
applyOccurenceIndicator occurs (genForCTree item)
278295
genForCTree (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
369387
genForName 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
423441
generateCBORTerm 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)
429447
generateCBORTerm' cddl n stdGen =
430448
let genEnv = GenEnv {cddl}
431449
genState = GenState {randomSeed = stdGen, depth = 1}

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

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
{-# LANGUAGE LambdaCase #-}
22
{-# LANGUAGE OverloadedStrings #-}
3+
{-# LANGUAGE TypeData #-}
4+
{-# LANGUAGE TypeFamilies #-}
35
{-# LANGUAGE ViewPatterns #-}
46

57
module Codec.CBOR.Cuddle.CBOR.Validator (
@@ -12,7 +14,8 @@ module Codec.CBOR.Cuddle.CBOR.Validator (
1214
import Codec.CBOR.Cuddle.CDDL hiding (CDDL, Group, Rule)
1315
import Codec.CBOR.Cuddle.CDDL.CTree
1416
import Codec.CBOR.Cuddle.CDDL.CtlOp
15-
import Codec.CBOR.Cuddle.CDDL.Resolve
17+
import Codec.CBOR.Cuddle.CDDL.Resolve (MonoReferenced, XXCTree (..))
18+
import Codec.CBOR.Cuddle.IndexMappable (IndexMappable (..))
1619
import Codec.CBOR.Read
1720
import Codec.CBOR.Term
1821
import Control.Exception
@@ -37,8 +40,25 @@ import System.Exit
3740
import System.IO
3841
import Text.Regex.TDFA
3942

40-
type CDDL = CTreeRoot MonoReferenced
41-
type Rule = CTree MonoReferenced
43+
type data ValidatorStage
44+
45+
data instance XTerm ValidatorStage = ValidatorXTerm
46+
deriving (Show)
47+
48+
newtype instance XXCTree ValidatorStage = VRuleRef Name
49+
deriving (Show)
50+
51+
instance IndexMappable CTreeRoot MonoReferenced ValidatorStage where
52+
mapIndex (CTreeRoot m) = CTreeRoot $ mapIndex <$> m
53+
54+
instance IndexMappable CTree MonoReferenced ValidatorStage where
55+
mapIndex = foldCTree mapExt mapIndex
56+
where
57+
mapExt (MRuleRef n) = CTreeE $ VRuleRef n
58+
mapExt (MGenerator _ x) = mapIndex x
59+
60+
type CDDL = CTreeRoot ValidatorStage
61+
type Rule = CTree ValidatorStage
4262

4363
data CBORTermResult = CBORTermResult Term CDDLResult
4464
deriving (Show)
@@ -114,7 +134,7 @@ data AMatchedItem = AMatchedItem
114134
--------------------------------------------------------------------------------
115135
-- Main entry point
116136

117-
validateCBOR :: BS.ByteString -> Name CTreePhase -> CDDL -> IO ()
137+
validateCBOR :: BS.ByteString -> Name -> CDDL -> IO ()
118138
validateCBOR bs rule cddl =
119139
( case validateCBOR' bs rule cddl of
120140
ok@(CBORTermResult _ (Valid _)) -> do
@@ -131,7 +151,7 @@ validateCBOR bs rule cddl =
131151
)
132152

133153
validateCBOR' ::
134-
BS.ByteString -> Name CTreePhase -> CDDL -> CBORTermResult
154+
BS.ByteString -> Name -> CDDL -> CBORTermResult
135155
validateCBOR' bs rule cddl@(CTreeRoot tree) =
136156
case deserialiseFromBytes decodeTerm (BSL.fromStrict bs) of
137157
Left e -> error $ show e
@@ -1016,7 +1036,7 @@ validateChoice v rules = go rules
10161036
. ($ dummyRule)
10171037

10181038
dummyRule :: Rule
1019-
dummyRule = CTreeE $ MRuleRef (Name "dummy" mempty)
1039+
dummyRule = CTreeE $ VRuleRef "dummy"
10201040

10211041
--------------------------------------------------------------------------------
10221042
-- Control helpers
@@ -1108,7 +1128,7 @@ getIndicesOfEnum g =
11081128
-- Resolving rules from the CDDL spec
11091129

11101130
resolveIfRef :: CDDL -> Rule -> Rule
1111-
resolveIfRef ct@(CTreeRoot cddl) (CTreeE (MRuleRef n)) = do
1131+
resolveIfRef ct@(CTreeRoot cddl) (CTreeE (VRuleRef n)) = do
11121132
case Map.lookup n cddl of
11131133
Nothing -> error $ "Unbound reference: " <> show n
11141134
Just val -> resolveIfRef ct val

src/Codec/CBOR/Cuddle/CDDL.hs

Lines changed: 16 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -154,30 +154,20 @@ deriving instance ForAllExtensions i ToExpr => ToExpr (TopLevel i)
154154
--
155155
-- * Rule names (types or groups) do not appear in the actual CBOR
156156
-- encoding, but names used as "barewords" in member keys do.
157-
data Name i = Name
158-
{ name :: T.Text
159-
, nameExt :: XTerm i
160-
}
157+
newtype Name = Name {name :: T.Text}
161158
deriving (Generic)
159+
deriving (Eq, Ord, Show)
160+
deriving newtype (Semigroup, Monoid)
162161

163-
deriving instance Eq (XTerm i) => Eq (Name i)
164-
165-
deriving instance Ord (XTerm i) => Ord (Name i)
166-
167-
deriving instance Show (XTerm i) => Show (Name i)
168-
169-
deriving instance ToExpr (XTerm i) => ToExpr (Name i)
170-
171-
instance Monoid (XTerm i) => IsString (Name i) where
172-
fromString x = Name (T.pack x) mempty
162+
deriving anyclass instance ToExpr Name
173163

174-
instance HasComment (XTerm i) => HasComment (Name i) where
175-
commentL = #nameExt % commentL
164+
instance IsString Name where
165+
fromString = Name . T.pack
176166

177-
instance CollectComments (XTerm i) => CollectComments (Name i) where
178-
collectComments (Name _ c) = collectComments c
167+
instance CollectComments Name where
168+
collectComments _ = []
179169

180-
instance Hashable (XTerm i) => Hashable (Name i)
170+
instance Hashable Name
181171

182172
-- |
183173
-- assignt = "=" / "/="
@@ -212,7 +202,7 @@ data Assign = AssignEq | AssignExt
212202
--
213203
-- Generic rules can be used for establishing names for both types and
214204
-- groups.
215-
newtype GenericParam i = GenericParam (NE.NonEmpty (Name i))
205+
newtype GenericParam i = GenericParam (NE.NonEmpty Name)
216206
deriving (Generic)
217207
deriving newtype (Semigroup)
218208

@@ -258,7 +248,7 @@ instance ForAllExtensions i CollectComments => CollectComments (GenericArg i)
258248
-- this semantic processing may need to span several levels of rule
259249
-- definitions before a determination can be made.)
260250
data Rule i = Rule
261-
{ ruleName :: Name i
251+
{ ruleName :: Name
262252
, ruleGenParam :: Maybe (GenericParam i)
263253
, ruleAssign :: Assign
264254
, ruleTerm :: TypeOrGroup i
@@ -405,7 +395,7 @@ data Type2 i
405395
T2Value Value
406396
| -- | or be defined by a rule giving a meaning to a name (possibly after
407397
-- supplying generic arguments as required by the generic parameters)
408-
T2Name (Name i) (Maybe (GenericArg i))
398+
T2Name Name (Maybe (GenericArg i))
409399
| -- | or be defined in a parenthesized type expression (parentheses may be
410400
-- necessary to override some operator precedence),
411401
T2Group (Type0 i)
@@ -419,11 +409,11 @@ data Type2 i
419409
T2Array (Group i)
420410
| -- | an "unwrapped" group (see Section 3.7), which matches the group
421411
-- inside a type defined as a map or an array by wrapping the group, or
422-
T2Unwrapped (Name i) (Maybe (GenericArg i))
412+
T2Unwrapped Name (Maybe (GenericArg i))
423413
| -- | an enumeration expression, which matches any value that is within the
424414
-- set of values that the values of the group given can take, or
425415
T2Enum (Group i)
426-
| T2EnumRef (Name i) (Maybe (GenericArg i))
416+
| T2EnumRef Name (Maybe (GenericArg i))
427417
| -- | a tagged data item, tagged with the "uint" given and containing the
428418
-- type given as the tagged value, or
429419
T2Tag (Maybe Word64) (Type0 i)
@@ -529,7 +519,7 @@ instance ForAllExtensions i CollectComments => CollectComments (GroupEntry i) wh
529519

530520
data GroupEntryVariant i
531521
= GEType (Maybe (MemberKey i)) (Type0 i)
532-
| GERef (Name i) (Maybe (GenericArg i))
522+
| GERef Name (Maybe (GenericArg i))
533523
| GEGroup (Group i)
534524
deriving (Generic)
535525

@@ -557,7 +547,7 @@ instance ForAllExtensions i CollectComments => CollectComments (GroupEntryVarian
557547
-- presence of the cuts denoted by "^" or ":" in previous entries).
558548
data MemberKey i
559549
= MKType (Type1 i)
560-
| MKBareword (Name i)
550+
| MKBareword Name
561551
| MKValue Value
562552
deriving (Generic)
563553

0 commit comments

Comments
 (0)