From 33b3e1fc299e22ce64b5179613b28410208d9596 Mon Sep 17 00:00:00 2001 From: Celestino Amoroso Date: Fri, 19 Jul 2024 15:37:00 +0200 Subject: [PATCH] New function for searching and importing plugin --- operator-plugin.go | 26 ++------------------------ plugins.go | 24 ++++++++++++++++++++++++ t_plugin_test.go | 13 ++++++++++--- 3 files changed, 36 insertions(+), 27 deletions(-) diff --git a/operator-plugin.go b/operator-plugin.go index 464fd58..2a4d3a3 100644 --- a/operator-plugin.go +++ b/operator-plugin.go @@ -4,10 +4,6 @@ // operator-plugin.go package expr -import ( - "io" -) - //-------- plugin term func newPluginTerm(tk *Token) (inst *term) { @@ -22,31 +18,13 @@ func newPluginTerm(tk *Token) (inst *term) { func evalPlugin(ctx ExprContext, opTerm *term) (v any, err error) { var childValue any - var moduleSpec any + var count int if childValue, err = opTerm.evalPrefix(ctx); err != nil { return } - dirList := buildSearchDirList("plugin", ENV_EXPR_PLUGIN_PATH) - count := 0 - it := NewAnyIterator(childValue) - for moduleSpec, err = it.Next(); err == nil; moduleSpec, err = it.Next() { - if module, ok := moduleSpec.(string); ok { - if err = importPlugin(dirList, module); err != nil { - break - } - count++ - } else { - err = opTerm.Errorf("expected string as item nr %d, got %s", it.Index()+1, TypeName(moduleSpec)) - break - } - } - if err == io.EOF { - err = nil - } - - if err == nil { + if count, err = importPluginFromSearchPath(childValue); err == nil { v = int64(count) } return diff --git a/plugins.go b/plugins.go index 3d0c12d..385da52 100644 --- a/plugins.go +++ b/plugins.go @@ -6,6 +6,7 @@ package expr import ( "fmt" + "io" "os" "plugin" "strings" @@ -90,6 +91,29 @@ func importPlugin( /*ctx ExprContext,*/ dirList []string, name string) (err erro return } +func importPluginFromSearchPath(name any) (count int, err error) { + var moduleSpec any + + dirList := buildSearchDirList("plugin", ENV_EXPR_PLUGIN_PATH) + count = 0 + it := NewAnyIterator(name) + for moduleSpec, err = it.Next(); err == nil; moduleSpec, err = it.Next() { + if module, ok := moduleSpec.(string); ok { + if err = importPlugin(dirList, module); err != nil { + break + } + count++ + } else { + err = fmt.Errorf("expected string as item nr %d, got %s", it.Index()+1, TypeName(moduleSpec)) + break + } + } + if err == io.EOF { + err = nil + } + return +} + func loadModules(dirList []string, moduleNames []string) (err error) { for _, name := range moduleNames { if err1 := importPlugin(dirList, name); err1 != nil { diff --git a/t_plugin_test.go b/t_plugin_test.go index c4995f7..d949657 100644 --- a/t_plugin_test.go +++ b/t_plugin_test.go @@ -8,9 +8,16 @@ import ( "testing" ) -func _TestImportPlugin(t *testing.T) { - if err := importPlugin([]string{"test-resources"}, "json"); err != nil { - t.Errorf("importPlugin() failed: %v", err) +func TestImportPlugin(t *testing.T) { + t.Setenv("PLUGINS", "${HOME}/go/src/git.portale-stac.it/go") + t.Setenv("EXPR_PLUGIN_PATH","${PLUGINS}/expr-json-plugin:${PLUGINS}/expr-csv-plugin") + + gotCount, gotErr := importPluginFromSearchPath("json") + if gotCount != 1 { + t.Errorf("Import count: got=%d, want=1", gotCount) + } + if gotErr != nil { + t.Errorf("importPlugin() failed: %v", gotErr) } }