@@ -53,7 +53,6 @@ import Data.Generics.Wrapped
53
53
( _Unwrapped
54
54
)
55
55
import qualified Data.List as List
56
- import qualified Data.Map.Strict as Map
57
56
import Data.Text
58
57
( Text
59
58
)
@@ -103,6 +102,12 @@ import Kore.Internal.TermLike
103
102
import Kore.Log.ErrorRewriteLoop
104
103
( errorRewriteLoop
105
104
)
105
+ import Kore.Log.ErrorRuleMergeDuplicateId
106
+ ( errorRuleMergeDuplicateId
107
+ )
108
+ import Kore.Log.ErrorRuleMergeDuplicateLabel
109
+ ( errorRuleMergeDuplicateLabel
110
+ )
106
111
import Kore.Log.InfoExecDepth
107
112
import Kore.Log.KoreLogOptions
108
113
( KoreLogOptions (.. )
@@ -562,48 +567,67 @@ mergeRules ruleMerger verifiedModule ruleNames =
562
567
rules <- extractRules rewriteRules' ruleNames
563
568
lift $ ruleMerger rules
564
569
565
- -- TODO: what if a label name and an id name coincide?
566
570
extractRules
567
571
:: forall m
568
572
. Monad m
569
573
=> [RewriteRule VariableName ]
570
574
-> [Text ]
571
575
-> ExceptT Text m (NonEmpty (RewriteRule VariableName ))
572
576
extractRules rules names = do
573
- -- TODO: assert unique names
574
- let rulesById = mapMaybe ruleById rules
575
- rulesByLabel = mapMaybe ruleByLabel rules
576
- ruleRegistry = Map. fromList (rulesById <> rulesByLabel)
577
- extractedRules <- traverse (extractRule ruleRegistry) names
577
+ extractedRules <- traverse extractRule names
578
578
case extractedRules of
579
579
[] -> throwE " Empty rule list."
580
580
(r : rs) -> return (r :| rs)
581
-
582
581
where
583
- -- TODO: more clean-up
584
- maybeRuleUniqueId :: RewriteRule VariableName -> Maybe Text
585
- maybeRuleUniqueId =
582
+ extractRule name = do
583
+ let rulesWithId =
584
+ filter (\ rule -> lensUniqueId rule == Just name) rules
585
+ rulesWithLabel =
586
+ filter (\ rule -> lensLabel rule == Just name) rules
587
+ case getRuleExtractionResult rulesWithId rulesWithLabel of
588
+ ErrorRuleNotFound -> throwE (" Rule not found: '" <> name <> " '." )
589
+ FoundRule rule -> return rule
590
+ ErrorDuplicateId rules' ->
591
+ errorRuleMergeDuplicateId rules' name
592
+ ErrorDuplicateLabel rules' ->
593
+ errorRuleMergeDuplicateLabel rules' name
594
+ ErrorIdAndLabelNamesCoincide ->
595
+ throwE (" Rule name: '" <> name <> " ' is both an id and a label." )
596
+
597
+ lensUniqueId =
586
598
Lens. view
587
- (_Unwrapped . field @ " attributes" . field @ " uniqueId" . _Unwrapped)
588
-
589
- maybeRuleLabel :: RewriteRule VariableName -> Maybe Text
590
- maybeRuleLabel =
599
+ ( _Unwrapped
600
+ . field @ " attributes"
601
+ . field @ " uniqueId"
602
+ . _Unwrapped
603
+ )
604
+ lensLabel =
591
605
Lens. view
592
- (_Unwrapped . field @ " attributes" . field @ " label" . _Unwrapped)
593
-
594
- ruleById rule = do
595
- name <- maybeRuleUniqueId rule
596
- return (name, rule)
597
-
598
- ruleByLabel rule = do
599
- name <- maybeRuleLabel rule
600
- return (name, rule)
606
+ ( _Unwrapped
607
+ . field @ " attributes"
608
+ . field @ " label"
609
+ . _Unwrapped
610
+ )
601
611
602
- extractRule registry ruleName =
603
- maybe
604
- (throwE $ " Rule not found: '" <> ruleName <> " '." )
605
- return
606
- (Map. lookup ruleName registry)
612
+ data RuleExtractionResult
613
+ = FoundRule (RewriteRule VariableName )
614
+ | ErrorRuleNotFound
615
+ | ErrorDuplicateId [RewriteRule VariableName ]
616
+ | ErrorDuplicateLabel [RewriteRule VariableName ]
617
+ | ErrorIdAndLabelNamesCoincide
618
+
619
+ getRuleExtractionResult
620
+ :: [RewriteRule VariableName ]
621
+ -> [RewriteRule VariableName ]
622
+ -> RuleExtractionResult
623
+ getRuleExtractionResult rulesWithId rulesWithLabel =
624
+ case (rulesWithId, rulesWithLabel) of
625
+ ([] , [] ) -> ErrorRuleNotFound
626
+ ([rule], [] ) -> FoundRule rule
627
+ ([] , [rule]) -> FoundRule rule
628
+ (rules, [] ) -> ErrorDuplicateId rules
629
+ ([] , rules) -> ErrorDuplicateLabel rules
630
+ _ -> ErrorIdAndLabelNamesCoincide
607
631
608
632
assertSingleClaim :: Monad m => [claim ] -> m ()
609
633
assertSingleClaim claims =
0 commit comments