From 0a542bfdba984634a2e160ee30fb94c7615f5773 Mon Sep 17 00:00:00 2001 From: PiMaDaum Date: Sun, 5 Feb 2023 22:19:54 +0100 Subject: [PATCH] Initialize the CEL program in a util function --- folder/filter.go | 15 +++------------ group/filter.go | 15 +++------------ resource/filter.go | 15 +++------------ user/filter.go | 15 +++------------ util/cel.go | 23 +++++++++++++++++++++++ 5 files changed, 35 insertions(+), 48 deletions(-) create mode 100644 util/cel.go diff --git a/folder/filter.go b/folder/filter.go index 3414da5..afcd433 100644 --- a/folder/filter.go +++ b/folder/filter.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/google/cel-go/cel" + "github.com/passbolt/go-passbolt-cli/util" "github.com/passbolt/go-passbolt/api" ) @@ -23,24 +24,14 @@ func filterFolders(folders *[]api.Folder, celCmd string, ctx context.Context) ([ return *folders, nil } - env, err := cel.NewEnv(celEnvOptions...) - if err != nil { - return nil, err - } - - ast, issue := env.Compile(celCmd) - if issue.Err() != nil { - return nil, issue.Err() - } - - program, err := env.Program(ast) + program, err := util.InitCELProgram(celCmd, celEnvOptions...) if err != nil { return nil, err } filteredFolders := []api.Folder{} for _, folder := range *folders { - val, _, err := program.ContextEval(ctx, map[string]any{ + val, _, err := (*program).ContextEval(ctx, map[string]any{ "ID": folder.ID, "FolderParentID": folder.FolderParentID, "Name": folder.Name, diff --git a/group/filter.go b/group/filter.go index 0da4d01..0b85d67 100644 --- a/group/filter.go +++ b/group/filter.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/google/cel-go/cel" + "github.com/passbolt/go-passbolt-cli/util" "github.com/passbolt/go-passbolt/api" ) @@ -22,24 +23,14 @@ func filterGroups(groups *[]api.Group, celCmd string, ctx context.Context) ([]ap return *groups, nil } - env, err := cel.NewEnv(celEnvOptions...) - if err != nil { - return nil, err - } - - ast, issue := env.Compile(celCmd) - if issue.Err() != nil { - return nil, issue.Err() - } - - program, err := env.Program(ast) + program, err := util.InitCELProgram(celCmd, celEnvOptions...) if err != nil { return nil, err } filteredGroups := []api.Group{} for _, group := range *groups { - val, _, err := program.ContextEval(ctx, map[string]any{ + val, _, err := (*program).ContextEval(ctx, map[string]any{ "ID": group.ID, "Name": group.Name, "CreatedTimestamp": group.Created.Time, diff --git a/resource/filter.go b/resource/filter.go index 22c2550..2cc1f31 100644 --- a/resource/filter.go +++ b/resource/filter.go @@ -7,6 +7,7 @@ import ( "github.com/google/cel-go/cel" "github.com/google/cel-go/common/types" "github.com/google/cel-go/common/types/ref" + "github.com/passbolt/go-passbolt-cli/util" "github.com/passbolt/go-passbolt/api" "github.com/passbolt/go-passbolt/helper" ) @@ -30,24 +31,14 @@ func filterResources(resources *[]api.Resource, celCmd string, ctx context.Conte return *resources, nil } - env, err := cel.NewEnv(celEnvOptions...) - if err != nil { - return nil, err - } - - ast, issue := env.Compile(celCmd) - if issue.Err() != nil { - return nil, issue.Err() - } - - program, err := env.Program(ast) + program, err := util.InitCELProgram(celCmd, celEnvOptions...) if err != nil { return nil, err } filteredResources := []api.Resource{} for _, resource := range *resources { - val, _, err := program.ContextEval(ctx, map[string]any{ + val, _, err := (*program).ContextEval(ctx, map[string]any{ "Id": resource.ID, "FolderParentID": resource.FolderParentID, "Name": resource.Name, diff --git a/user/filter.go b/user/filter.go index e355e82..973fce7 100644 --- a/user/filter.go +++ b/user/filter.go @@ -5,6 +5,7 @@ import ( "fmt" "github.com/google/cel-go/cel" + "github.com/passbolt/go-passbolt-cli/util" "github.com/passbolt/go-passbolt/api" ) @@ -25,24 +26,14 @@ func filterUsers(users *[]api.User, celCmd string, ctx context.Context) ([]api.U return *users, nil } - env, err := cel.NewEnv(celEnvOptions...) - if err != nil { - return nil, err - } - - ast, issue := env.Compile(celCmd) - if issue.Err() != nil { - return nil, issue.Err() - } - - program, err := env.Program(ast) + program, err := util.InitCELProgram(celCmd, celEnvOptions...) if err != nil { return nil, err } filteredUsers := []api.User{} for _, user := range *users { - val, _, err := program.ContextEval(ctx, map[string]any{ + val, _, err := (*program).ContextEval(ctx, map[string]any{ "ID": user.ID, "Username": user.Username, "FirstName": user.Profile.FirstName, diff --git a/util/cel.go b/util/cel.go new file mode 100644 index 0000000..1e41f95 --- /dev/null +++ b/util/cel.go @@ -0,0 +1,23 @@ +package util + +import "github.com/google/cel-go/cel" + +// InitCELProgram - Initialize a CEL program with given CEL command and a set of environments +func InitCELProgram(celCmd string, options ...cel.EnvOption) (*cel.Program, error) { + env, err := cel.NewEnv(options...) + if err != nil { + return nil, err + } + + ast, issue := env.Compile(celCmd) + if issue.Err() != nil { + return nil, issue.Err() + } + + program, err := env.Program(ast) + if err != nil { + return nil, err + } + + return &program, nil +}