// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com). // All rights reserved. // operator-plugin.go package expr import ( "io" ) //-------- plugin term func newPluginTerm(tk *Token) (inst *term) { return &term{ tk: *tk, children: make([]*term, 0, 1), position: posPrefix, priority: priSign, evalFunc: evalPlugin, } } func evalPlugin(ctx ExprContext, opTerm *term) (v any, err error) { var childValue any var moduleSpec any 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 { v = int64(count) } return } // init func init() { registerTermConstructor(SymKwPlugin, newPluginTerm) }