现在在做漏洞检测方面的工作,用到了cel-go这个包中的表达式引擎。有人能给讲讲吗。阅读源码,简单的可以理解,复杂的就完蛋了。
package main
import (
"fmt"
"github.com/golang/protobuf/proto"
descpb "github.com/golang/protobuf/protoc-gen-go/descriptor"
"github.com/google/cel-go/cel"
"github.com/google/cel-go/checker/decls"
"io/ioutil"
)
type member struct {
Members []N `json:"members"`
}
type N struct {
Name string `json:"name"`
}
func main(){
b, err := ioutil.ReadFile("cel/testdata/team.fds")
if err != nil {
fmt.Println("can't read fds file: ", err)
}
var fds descpb.FileDescriptorSet
if err = proto.Unmarshal(b, &fds); err != nil {
fmt.Println("can't unmarshal descriptor data: ", err)
}
fmt.Println("fds:",fds)
e, err := cel.NewEnv(
cel.TypeDescs(&fds),
cel.Declarations(
decls.NewVar("myteam",
decls.NewObjectType("cel.testdata.Team"))))
if err != nil {
fmt.Println("can't create env: ", err)
}
//src := "myteam.name == 'Cyclops'"
src := "myteam.members[0].name == 'Cyclops'"
ast, iss := e.Compile(src)
if iss.Err() != nil {
fmt.Println(iss.Err())
}
fmt.Println("ast:",ast.Expr())
prg, err := e.Program(ast)
if err != nil {
//fmt.Printf("Program creation error: %v", err)
fmt.Println("err:",err)
}
n:= N{"123"}
parameter := map[string]interface{}{"myteam":member{[]N{n,n}}}
out, _, err := prg.Eval(parameter)
if err != nil {
//fmt.Printf("Evaluation error: %v", err)
fmt.Println("err:",err)
}
fmt.Println("out:",out)
}
看了源码中的一个测试用例,读取文件,然后进行判断,但是现在不知道怎么编写 prg.Eval(parameter) 这个方法的入参。求大神帮助。
有疑问加站长微信联系(非本文作者)