package main
import (
"fmt"
"github.com/newm4n/grool/builder"
"github.com/newm4n/grool/context"
"github.com/newm4n/grool/engine"
"github.com/newm4n/grool/model"
"github.com/newm4n/grool/pkg"
"testing"
)
const (rule2 = `
rule AgeNameCheck "test" {
when
Pogo.GetStringLength("9999") > 0
then
Log(User.Name);
}
`
)
type MyPoGo struct {
}
func (p *MyPoGo) GetStringLength(sarg string) int {
return len(sarg)
}
type User struct {
Name string
Age int
Male bool
}
func testMyRule(t *testing.T){
user := &User{
Name: "Calo",
Age: 0,
Male: true,
}
dataContext := context.NewDataContext()
dataContext.Add("User", user)
dataContext.Add("Pogo", &MyPoGo{})
//εε§εθ§εεΌζ
knowledgeBase := model.NewKnowledgeBase()
ruleBuilder := builder.NewRuleBuilder(knowledgeBase)
err := ruleBuilder.BuildRuleFromResource(pkg.NewBytesResource([]byte(rule2)))
if err != nil{
fmt.Println(err)
}else{
eng1 := &engine.Grool{MaxCycle:1}
eng1.Execute(dataContext,knowledgeBase)
if err !=nil{
fmt.Println("err:",err)
}else {
fmt.Println(user)
}
}
}
func main() {
t := &testing.T{}
testMyRule(t)
}
ERROR:
GOROOT=/Users/renyunyi/sdk/go1.13 #gosetup
GOPATH=/Users/renyunyi/go #gosetup
/Users/renyunyi/sdk/go1.13/bin/go build -o /private/var/folders/k2/3y7zc6yx7nvbxp4xsbbdrknc0000gn/T/___go_build_main_go /Users/renyunyi/go/src/blive-risk/main.go #gosetup
/private/var/folders/k2/3y7zc6yx7nvbxp4xsbbdrknc0000gn/T/___go_build_main_go #gosetup
panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x1 addr=0x20 pc=0x13baec9]
goroutine 1 [running]:
github.com/newm4n/grool/model.(*ExpressionAtom).Evaluate(0x0, 0x400, 0x1b13900, 0x20300000000000, 0x1cfffff, 0xc0001b38c0)
/Users/renyunyi/go/src/github.com/newm4n/grool/model/ExpressionAtom.go:25 +0x29
github.com/newm4n/grool/model.(*ExpressionAtom).Evaluate(0xc0000c7b00, 0x400, 0x400, 0x1b13900, 0x1cfffff, 0xc0001b3900)
/Users/renyunyi/go/src/github.com/newm4n/grool/model/ExpressionAtom.go:32 +0x60
github.com/newm4n/grool/model.(*Predicate).Evaluate(0xc000242700, 0xc000141380, 0x1, 0x0, 0xc0002521e8, 0xc0001b3b50)
/Users/renyunyi/go/src/github.com/newm4n/grool/model/Predicate.go:53 +0x51
github.com/newm4n/grool/model.(*Expression).Evaluate(0xc0002426c0, 0x0, 0x18b8200, 0x14302e0, 0xc0000caea8, 0xc0001432c0)
/Users/renyunyi/go/src/github.com/newm4n/grool/model/Expression.go:53 +0x460
github.com/newm4n/grool/model.(*WhenScope).ExecuteWhen(0xc00025cb80, 0x10106f3, 0xc0001b3d28, 0x18b8200)
/Users/renyunyi/go/src/github.com/newm4n/grool/model/WhenScope.go:41 +0x32
github.com/newm4n/grool/model.(*RuleEntry).CanExecute(0xc000268410, 0xc0001432c0, 0xc0001b3d28, 0x18b8200)
/Users/renyunyi/go/src/github.com/newm4n/grool/model/RuleEntry.go:43 +0x2f
github.com/newm4n/grool/engine.(*Grool).Execute(0xc0001b3dd8, 0xc000141380, 0xc0000c55c0, 0x0, 0x0)
/Users/renyunyi/go/src/github.com/newm4n/grool/engine/GroolEngine.go:54 +0x1ad
main.testMyRule(0xc000060e50)
/Users/renyunyi/go/src/blive-risk/main.go:58 +0x2f6
main.main()
/Users/renyunyi/go/src/blive-risk/main.go:70 +0x6f
Process finished with exit code 2