expr/func-import.go

85 lines
2.1 KiB
Go
Raw Normal View History

// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com).
// All rights reserved.
2024-04-02 06:49:16 +02:00
// func-import.go
package expr
import (
"io"
"os"
)
const ENV_EXPR_PATH = "EXPR_PATH"
func importFunc(ctx ExprContext, name string, args []any) (result any, err error) {
return importGeneral(ctx, name, args)
}
func importAllFunc(ctx ExprContext, name string, args []any) (result any, err error) {
enable(ctx, control_export_all)
return importGeneral(ctx, name, args)
}
func importGeneral(ctx ExprContext, name string, args []any) (result any, err error) {
2024-04-02 06:49:16 +02:00
var dirList []string
dirList = addEnvImportDirs(dirList)
dirList = addPresetImportDirs(ctx, dirList)
result, err = doImport(ctx, name, dirList, NewArrayIterator(args))
2024-04-02 06:49:16 +02:00
return
}
func addPresetImportDirs(ctx ExprContext, dirList []string) []string {
return addPresetDirs(ctx, ControlImportPath, dirList)
2024-04-02 06:49:16 +02:00
}
func doImport(ctx ExprContext, name string, dirList []string, it Iterator) (result any, err error) {
2024-04-02 06:49:16 +02:00
var v any
var sourceFilepath string
for v, err = it.Next(); err == nil; v, err = it.Next() {
if err = checkStringParamExpected(name, v, 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(ctx)
2024-04-06 01:00:29 +02:00
if expr, err = parser.parseGeneral(scanner, true, true); err == nil {
result, err = expr.eval(ctx, false)
2024-04-02 06:49:16 +02:00
}
2024-04-06 01:00:29 +02:00
if err != nil {
break
}
} else {
break
2024-04-02 06:49:16 +02:00
}
}
if err != nil {
if err == io.EOF {
err = nil
} else {
result = nil
}
2024-04-02 06:49:16 +02:00
}
return
}
func ImportImportFuncs(ctx ExprContext) {
ctx.RegisterFunc("import", NewGolangFunctor(importFunc), TypeAny, []ExprFuncParam{
NewFuncParamFlag(paramFilepath, PfRepeat),
})
ctx.RegisterFunc("importAll", NewGolangFunctor(importAllFunc), TypeAny, []ExprFuncParam{
NewFuncParamFlag(paramFilepath, PfRepeat),
})
2024-04-02 06:49:16 +02:00
}
2024-04-21 14:24:56 +02:00
func init() {
registerImport("import", ImportImportFuncs, "Functions import() and include()")
2024-04-21 14:24:56 +02:00
}