Skip to content

Commit f22cfd1

Browse files
authored
Merge pull request #104 from input-output-hk/jj/disallow-duplicate-definitions
Add duplicate definition check
2 parents 29963bd + a88e1a1 commit f22cfd1

File tree

1 file changed

+39
-8
lines changed

1 file changed

+39
-8
lines changed

src/Codec/CBOR/Cuddle/Huddle.hs

Lines changed: 39 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
{-# LANGUAGE FunctionalDependencies #-}
44
{-# LANGUAGE LambdaCase #-}
55
{-# LANGUAGE OverloadedStrings #-}
6+
{-# LANGUAGE RecordWildCards #-}
67
{-# LANGUAGE TypeFamilies #-}
78

89
-- | Module for building CDDL in Haskell
@@ -99,6 +100,7 @@ import Data.List qualified as L
99100
import Data.List.NonEmpty qualified as NE
100101
import Data.Map.Ordered.Strict (OMap, (|<>))
101102
import Data.Map.Ordered.Strict qualified as OMap
103+
import Data.Set qualified as Set
102104
import Data.String (IsString (fromString))
103105
import Data.Text qualified as T
104106
import Data.Tuple.Optics (Field2 (..))
@@ -1061,24 +1063,53 @@ collectFromInit rules =
10611063
-- Conversion to CDDL
10621064
--------------------------------------------------------------------------------
10631065

1066+
data HuddleConfig = HuddleConfig
1067+
{ hcMakePseudoRoot :: Bool
1068+
, hcFailOnDuplicateDefinitions :: Bool
1069+
}
1070+
1071+
defaultHuddleConfig :: HuddleConfig
1072+
defaultHuddleConfig =
1073+
HuddleConfig
1074+
{ hcMakePseudoRoot = True
1075+
, hcFailOnDuplicateDefinitions = True
1076+
}
1077+
10641078
-- | Convert from Huddle to CDDL, generating a top level root element.
10651079
toCDDL :: Huddle -> CDDL
1066-
toCDDL = toCDDL' True
1080+
toCDDL = toCDDL' defaultHuddleConfig
10671081

10681082
-- | Convert from Huddle to CDDL, skipping a root element.
10691083
toCDDLNoRoot :: Huddle -> CDDL
1070-
toCDDLNoRoot = toCDDL' False
1084+
toCDDLNoRoot =
1085+
toCDDL'
1086+
defaultHuddleConfig
1087+
{ hcMakePseudoRoot = False
1088+
}
10711089

10721090
-- | Convert from Huddle to CDDL for the purpose of pretty-printing.
1073-
toCDDL' :: Bool -> Huddle -> CDDL
1074-
toCDDL' mkPseudoRoot hdl =
1091+
toCDDL' :: HuddleConfig -> Huddle -> CDDL
1092+
toCDDL' HuddleConfig {..} hdl =
10751093
C.fromRules
1076-
$ ( if mkPseudoRoot
1077-
then (toTopLevelPseudoRoot (roots hdl) NE.<|)
1078-
else id
1079-
)
1094+
. failOnDuplicate
1095+
. makePseudoRoot
10801096
$ fmap toCDDLItem (NE.fromList $ fmap (view _2) $ toList $ items hdl)
10811097
where
1098+
makePseudoRoot
1099+
| hcMakePseudoRoot = (toTopLevelPseudoRoot (roots hdl) NE.<|)
1100+
| otherwise = id
1101+
1102+
failOnDuplicate rs
1103+
| hcFailOnDuplicateDefinitions = go mempty $ toList rs
1104+
| otherwise = rs
1105+
where
1106+
go _ [] = rs
1107+
go s (x : xs)
1108+
| n `Set.member` s = error . T.unpack $ "Duplicate definitions found for '" <> n <> "'"
1109+
| otherwise = go (Set.insert n s) xs
1110+
where
1111+
n = C.name (C.ruleName x)
1112+
10821113
toCDDLItem (HIRule r) = toCDDLRule r
10831114
toCDDLItem (HIGroup g) = toCDDLGroup g
10841115
toCDDLItem (HIGRule g) = toGenRuleDef g

0 commit comments

Comments
 (0)