feat(rules): add Rule interface, Pipeline, and WhitelistRule
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
package rules
|
||||
|
||||
// Pipeline evaluates a sequence of rules, stopping on first rejection.
|
||||
type Pipeline struct {
|
||||
rules []Rule
|
||||
}
|
||||
|
||||
// NewPipeline creates a rules pipeline from the given rules.
|
||||
func NewPipeline(rules []Rule) *Pipeline {
|
||||
return &Pipeline{rules: rules}
|
||||
}
|
||||
|
||||
// Evaluate runs all rules in order. Returns the first rejection or a merged accept.
|
||||
func (p *Pipeline) Evaluate(ctx EmailContext) RuleResult {
|
||||
merged := Accept()
|
||||
for _, r := range p.rules {
|
||||
result := r.Evaluate(ctx)
|
||||
if !result.Accepted {
|
||||
return result
|
||||
}
|
||||
for k, v := range result.Metadata {
|
||||
if merged.Metadata == nil {
|
||||
merged.Metadata = map[string]string{k: v}
|
||||
} else {
|
||||
merged.Metadata[k] = v
|
||||
}
|
||||
}
|
||||
}
|
||||
return merged
|
||||
}
|
||||
Reference in New Issue
Block a user