@@ -97,7 +97,6 @@ import Codec.CBOR.Cuddle.CDDL (CDDL)
9797import Codec.CBOR.Cuddle.CDDL qualified as C
9898import Codec.CBOR.Cuddle.CDDL.CtlOp qualified as CtlOp
9999import Codec.CBOR.Cuddle.Comments qualified as C
100- import Control.Monad (when )
101100import Control.Monad.State (MonadState (get ), execState , modify )
102101import Data.ByteString (ByteString )
103102import Data.Default.Class (Default (.. ))
@@ -109,6 +108,7 @@ import Data.Map.Ordered.Strict (OMap, (|<>))
109108import Data.Map.Ordered.Strict qualified as OMap
110109import Data.Set qualified as Set
111110import Data.String (IsString (fromString ))
111+ import Data.Text (Text )
112112import Data.Text qualified as T
113113import Data.Tuple.Optics (Field2 (.. ))
114114import Data.Void (Void )
@@ -1007,6 +1007,10 @@ hiName (HIRule (Named n _ _)) = n
10071007hiName (HIGroup (Named n _ _)) = n
10081008hiName (HIGRule (Named n _ _)) = n
10091009
1010+ data HuddleError
1011+ = DuplicateDefinitions Text
1012+ deriving (Eq , Show )
1013+
10101014-- | Collect all rules starting from a given point. This will also insert a
10111015-- single pseudo-rule as the first element which references the specified
10121016-- top-level rules.
@@ -1017,6 +1021,12 @@ collectFrom topRs =
10171021 (traverse goHuddleItem topRs)
10181022 OMap. empty
10191023 where
1024+ whenNotDefined n m = do
1025+ items <- get
1026+ if OMap. notMember n items
1027+ then m
1028+ else error $ " Duplicate definitions found: " <> show n
1029+
10201030 toHuddle items =
10211031 Huddle
10221032 { roots = concatMap hiRule topRs
@@ -1026,21 +1036,18 @@ collectFrom topRs =
10261036 goHuddleItem (HIGroup g) = goNamedGroup g
10271037 goHuddleItem (HIGRule (Named _ (GRule _ t0) _)) = goT0 t0
10281038 goRule r@ (Named n t0 _) = do
1029- items <- get
1030- when (OMap. notMember n items) $ do
1039+ whenNotDefined n $ do
10311040 modify (OMap. |> (n, HIRule r))
10321041 goT0 t0
10331042 goChoice f (NoChoice x) = f x
10341043 goChoice f (ChoiceOf x xs) = f x >> goChoice f xs
10351044 goT0 = goChoice goT2
10361045 goNamedGroup r@ (Named n g _) = do
1037- items <- get
1038- when (OMap. notMember n items) $ do
1046+ whenNotDefined n $ do
10391047 modify (OMap. |> (n, HIGroup r))
10401048 goGroup g
10411049 goGRule r@ (Named n g _) = do
1042- items <- get
1043- when (OMap. notMember n items) $ do
1050+ whenNotDefined n $ do
10441051 modify (OMap. |> (n, HIGRule $ fmap callToDef r))
10451052 goT0 (body g)
10461053 -- Note that the parameters here may be different, so this doesn't live
0 commit comments