hyperjumptech/grule-rule-engine

panic: runtime error: invalid memory address or nil pointer dereference

meetme2meat opened this issue · 0 comments

Describe the bug

panic: runtime error: invalid memory address or nil pointer dereference
[signal SIGSEGV: segmentation violation code=0x2 addr=0x40 pc=0x100a9275c]

goroutine 1 [running]:
github.com/hyperjumptech/grule-rule-engine/engine.(*GruleEngine).ExecuteWithContext(0x140000cfe40, {0x101607eb0, 0x1400003c1b0}, {0x10160d8d0?, 0x14000192480}, 0x0)
	/Users/virendranegi/Documents/goProject/pkg/mod/github.com/hyperjumptech/grule-rule-engine@v1.13.0/engine/GruleEngine.go:114 +0x3c
github.com/hyperjumptech/grule-rule-engine/engine.(*GruleEngine).Execute(...)
	/Users/virendranegi/Documents/goProject/pkg/mod/github.com/hyperjumptech/grule-rule-engine@v1.13.0/engine/GruleEngine.go:80
main.main()
	/Users/virendranegi/Documents/goProject/src/github.com/SugarBox/grule-test-ex/main.go:54 +0x3e0
exit status 2

To Reproduce
Use the following JSON rule

var jsonRule = `{
	"name": "CheckValues",
	"desc": "Check the default values",
	"salience": 10,
	"when": {
		 "and": [
				{"eq": ["MF.name", "John Doe"]}
		 ]
	},
	"then": [
			{"set": ["Output.broadcast", true]},
			{"set": ["Output.validUser", true]},
			{"set": ["Output.disabled", true]},
			{"call": ["Log", {"const": "Valid User"}]}
	]
}`

With given golang code

func main() {
	lib := ast.NewKnowledgeLibrary()
	rb := builder.NewRuleBuilder(lib)
	underlying := pkg.NewReaderResource(bytes.NewBuffer([]byte(jsonRule)))
	resource := pkg.NewJSONResourceFromResource(underlying)
	_ = rb.BuildRuleFromResource("Test", "0.0.1", resource)

	// 	add JSON fact
	mf := []byte(`{"name" : "John Doe", "age" : 24, "gender" : "M", "height" : 74.8, "married" : false}`)
	output := []byte(`{"broadcast": false, "validUser": false, "disabled": false}`)
	dcx := ast.NewDataContext()

	err := dcx.AddJSON("Output", output)
	if err != nil {
		fmt.Println(err.Error())
	}

	err = dcx.AddJSON("MF", mf)
	if err != nil {
		fmt.Println(err.Error())
	}
	kb := lib.NewKnowledgeBaseInstance("Test", "0.0.1")
	// results in panic
	err = engine.NewGruleEngine().Execute(dcx, kb)
	if err != nil {
		fmt.Println(err.Error())
	}
	value := dcx.Get("Output").Value()
	if err != nil {
		fmt.Println(err.Error())
	}

	v := value.Interface()
	bytea, err := json.Marshal(v)
	if err != nil {
		fmt.Println(err.Error())
	}
	fmt.Printf("%s\n", bytea)
	fmt.Println("done...")
}

Expected behavior
If should return the Output json with value set each of field broadcast, validUser, disabled set to true