Skip to content

Commit 048126b

Browse files
committed
extractRules: refactor and add errors
1 parent 86b8bd1 commit 048126b

File tree

1 file changed

+53
-29
lines changed

1 file changed

+53
-29
lines changed

kore/src/Kore/Exec.hs

Lines changed: 53 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,6 @@ import Data.Generics.Wrapped
5353
( _Unwrapped
5454
)
5555
import qualified Data.List as List
56-
import qualified Data.Map.Strict as Map
5756
import Data.Text
5857
( Text
5958
)
@@ -103,6 +102,12 @@ import Kore.Internal.TermLike
103102
import Kore.Log.ErrorRewriteLoop
104103
( errorRewriteLoop
105104
)
105+
import Kore.Log.ErrorRuleMergeDuplicateId
106+
( errorRuleMergeDuplicateId
107+
)
108+
import Kore.Log.ErrorRuleMergeDuplicateLabel
109+
( errorRuleMergeDuplicateLabel
110+
)
106111
import Kore.Log.InfoExecDepth
107112
import Kore.Log.KoreLogOptions
108113
( KoreLogOptions (..)
@@ -562,48 +567,67 @@ mergeRules ruleMerger verifiedModule ruleNames =
562567
rules <- extractRules rewriteRules' ruleNames
563568
lift $ ruleMerger rules
564569

565-
-- TODO: what if a label name and an id name coincide?
566570
extractRules
567571
:: forall m
568572
. Monad m
569573
=> [RewriteRule VariableName]
570574
-> [Text]
571575
-> ExceptT Text m (NonEmpty (RewriteRule VariableName))
572576
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
578578
case extractedRules of
579579
[] -> throwE "Empty rule list."
580580
(r : rs) -> return (r :| rs)
581-
582581
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 =
586598
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 =
591605
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+
)
601611

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
607631

608632
assertSingleClaim :: Monad m => [claim] -> m ()
609633
assertSingleClaim claims =

0 commit comments

Comments
 (0)