Skip to content

Commit 7272ef7

Browse files
newm4nFerdinand Neman
andauthored
Added attempt to show rule name when Rule entry fails (hyperjumptech#408)
Co-authored-by: Ferdinand Neman <ferdinand@hyperjump.tech>
1 parent eb4f61d commit 7272ef7

File tree

5 files changed

+23
-5
lines changed

5 files changed

+23
-5
lines changed

ast/ArgumentList.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,7 @@ func (e *ArgumentList) Evaluate(dataContext IDataContext, memory *WorkingMemory)
134134
for i, exp := range e.Arguments {
135135
val, err := exp.Evaluate(dataContext, memory)
136136
if err != nil {
137+
137138
return values, err
138139
}
139140
values[i] = val

ast/ArrayMapSelector.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,7 @@ func (e *ArrayMapSelector) Evaluate(dataContext IDataContext, memory *WorkingMem
128128
if e.Expression != nil {
129129
val, err := e.Expression.Evaluate(dataContext, memory)
130130
if err != nil {
131+
131132
return val, err
132133
}
133134
e.Value = val

ast/DataContext.go

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ type DataContext struct {
3939
retracted []string
4040
variableChangeCount uint64
4141
complete bool
42+
ruleEntry *RuleEntry
4243
}
4344

4445
func (ctx *DataContext) GetKeys() []string {
@@ -63,6 +64,15 @@ func (ctx *DataContext) IsComplete() bool {
6364
return ctx.complete
6465
}
6566

67+
func (ctx *DataContext) GetRuleEntry() *RuleEntry {
68+
69+
return ctx.ruleEntry
70+
}
71+
72+
func (ctx *DataContext) SetRuleEntry(re *RuleEntry) {
73+
ctx.ruleEntry = re
74+
}
75+
6676
// IDataContext is the interface for the DataContext struct.
6777
type IDataContext interface {
6878
ResetVariableChangeCount()
@@ -80,6 +90,9 @@ type IDataContext interface {
8090
IsComplete() bool
8191
Retracted() []string
8292
Reset()
93+
94+
SetRuleEntry(re *RuleEntry)
95+
GetRuleEntry() *RuleEntry
8396
}
8497

8598
// ResetVariableChangeCount will reset the variable change count

ast/RuleEntry.go

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ func (e *RuleEntry) SetGrlText(grlText string) {
167167
func (e *RuleEntry) Evaluate(ctx context.Context, dataContext IDataContext, memory *WorkingMemory) (can bool, err error) {
168168
if ctx.Err() != nil {
169169

170-
return false, ctx.Err()
170+
return false, fmt.Errorf("context error on evaluating rule %s. got %w", e.RuleName, ctx.Err())
171171
}
172172
defer func() {
173173
if r := recover(); r != nil {
@@ -176,17 +176,18 @@ func (e *RuleEntry) Evaluate(ctx context.Context, dataContext IDataContext, memo
176176
}
177177
}()
178178
if e.Retracted {
179+
179180
return false, nil
180181
}
181182
val, err := e.WhenScope.Evaluate(dataContext, memory)
182183
if err != nil {
183184
AstLog.Errorf("Error while evaluating rule %s, got %v", e.RuleName, err)
184185

185-
return false, err
186+
return false, fmt.Errorf("evaluating expression in rule '%s' the when raised an error. got %v", dataContext.GetRuleEntry().RuleName, err)
186187
}
187188
if val.Kind() != reflect.Bool {
188189

189-
return false, fmt.Errorf("expression in when is not a boolean expression : %s", e.WhenScope.Expression.GetGrlText())
190+
return false, fmt.Errorf("evaluating expression in rule '%s', the when is not a boolean expression : %s", dataContext.GetRuleEntry().RuleName, e.WhenScope.Expression.GetGrlText())
190191
}
191192

192193
return val.Bool(), nil
@@ -196,15 +197,15 @@ func (e *RuleEntry) Evaluate(ctx context.Context, dataContext IDataContext, memo
196197
func (e *RuleEntry) Execute(ctx context.Context, dataContext IDataContext, memory *WorkingMemory) (err error) {
197198
if ctx.Err() != nil {
198199

199-
return ctx.Err()
200+
return fmt.Errorf("context error on executing rule %s. got %w", e.RuleName, ctx.Err())
200201
}
201202
if e.ThenScope == nil {
202203

203204
return fmt.Errorf("RuleEntry %s have no then scope", e.RuleName)
204205
}
205206
defer func() {
206207
if r := recover(); r != nil {
207-
err = fmt.Errorf("rule engine execute panic ! recovered : %v", r)
208+
err = fmt.Errorf("rule engine execute panic on rule %s ! recovered : %v", e.RuleName, r)
208209
}
209210
}()
210211

engine/GruleEngine.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,8 @@ func (g *GruleEngine) ExecuteWithContext(ctx context.Context, dataCtx ast.IDataC
218218
}
219219
}
220220
}
221+
// set the current rule entry to run. This is for trace ability purpose
222+
dataCtx.SetRuleEntry(runner)
221223
// notify listeners that we are about to execute a rule entry then scope
222224
g.notifyExecuteRuleEntry(cycle, runner)
223225
// execute the top most prioritized rule

0 commit comments

Comments
 (0)