81 lines
2.1 KiB
Go
81 lines
2.1 KiB
Go
// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com).
|
|
// All rights reserved.
|
|
|
|
// builtin-import.go
|
|
package expr
|
|
|
|
import (
|
|
"io"
|
|
"os"
|
|
|
|
"git.portale-stac.it/go-pkg/expr/kern"
|
|
)
|
|
|
|
func importFunc(ctx kern.ExprContext, name string, args map[string]any) (result any, err error) {
|
|
return importGeneral(ctx, name, args)
|
|
}
|
|
|
|
func importAllFunc(ctx kern.ExprContext, name string, args map[string]any) (result any, err error) {
|
|
CtrlEnable(ctx, kern.ControlExportAll)
|
|
return importGeneral(ctx, name, args)
|
|
}
|
|
|
|
func importGeneral(ctx kern.ExprContext, name string, args map[string]any) (result any, err error) {
|
|
dirList := buildSearchDirList(ctx, "sources", ENV_EXPR_SOURCE_PATH)
|
|
if v, exists := args[kern.ParamFilepath]; exists && v != nil {
|
|
argv := v.([]any)
|
|
result, err = doImport(ctx, name, dirList, NewArrayIterator(argv))
|
|
}
|
|
return
|
|
}
|
|
|
|
func doImport(ctx kern.ExprContext, name string, dirList []string, it kern.Iterator) (result any, err error) {
|
|
var v any
|
|
var sourceFilepath string
|
|
|
|
for v, err = it.Next(); err == nil; v, err = it.Next() {
|
|
if err = checkStringParamExpected(name, v, int(it.Index())); err != nil {
|
|
break
|
|
}
|
|
if sourceFilepath, err = makeFilepath(v.(string), dirList); err != nil {
|
|
break
|
|
}
|
|
var file *os.File
|
|
if file, err = os.Open(sourceFilepath); err == nil {
|
|
defer file.Close()
|
|
var expr *ast
|
|
scanner := NewScanner(file, DefaultTranslations())
|
|
parser := NewParser()
|
|
if expr, err = parser.parseGeneral(scanner, allowMultiExpr|allowVarRef, SymEos); err == nil {
|
|
result, err = expr.Eval(ctx)
|
|
}
|
|
if err != nil {
|
|
break
|
|
}
|
|
} else {
|
|
break
|
|
}
|
|
}
|
|
if err != nil {
|
|
if err == io.EOF {
|
|
err = nil
|
|
} else {
|
|
result = nil
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func ImportImportFuncs(ctx kern.ExprContext) {
|
|
ctx.RegisterFunc("import", kern.NewGolangFunctor(importFunc), kern.TypeAny, []kern.ExprFuncParam{
|
|
NewFuncParamFlag(kern.ParamFilepath, PfRepeat),
|
|
})
|
|
ctx.RegisterFunc("importAll", kern.NewGolangFunctor(importAllFunc), kern.TypeAny, []kern.ExprFuncParam{
|
|
NewFuncParamFlag(kern.ParamFilepath, PfRepeat),
|
|
})
|
|
}
|
|
|
|
func init() {
|
|
RegisterBuiltinModule("import", ImportImportFuncs, "Functions import() and include()")
|
|
}
|