2024-04-13 06:00:22 +02:00
|
|
|
// 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"
|
|
|
|
|
2024-04-08 23:17:56 +02:00
|
|
|
func importFunc(ctx ExprContext, name string, args []any) (result any, err error) {
|
2024-04-06 03:06:07 +02:00
|
|
|
return importGeneral(ctx, name, args)
|
|
|
|
}
|
|
|
|
|
2024-05-06 05:50:36 +02:00
|
|
|
func importAllFunc(ctx ExprContext, name string, args []any) (result any, err error) {
|
2024-04-06 03:06:07 +02:00
|
|
|
enable(ctx, control_export_all)
|
|
|
|
return importGeneral(ctx, name, args)
|
|
|
|
}
|
|
|
|
|
2024-04-08 23:17:56 +02:00
|
|
|
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)
|
2024-05-03 06:26:17 +02:00
|
|
|
result, err = doImport(ctx, name, dirList, NewArrayIterator(args))
|
2024-04-02 06:49:16 +02:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2024-04-08 23:17:56 +02:00
|
|
|
func addPresetImportDirs(ctx ExprContext, dirList []string) []string {
|
2024-06-06 05:31:35 +02:00
|
|
|
return addPresetDirs(ctx, ControlImportPath, dirList)
|
2024-04-02 06:49:16 +02:00
|
|
|
}
|
|
|
|
|
2024-04-08 23:17:56 +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 {
|
2024-04-08 23:17:56 +02:00
|
|
|
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
|
|
|
}
|
|
|
|
}
|
2024-04-06 03:06:07 +02:00
|
|
|
if err != nil {
|
|
|
|
if err == io.EOF {
|
|
|
|
err = nil
|
|
|
|
} else {
|
|
|
|
result = nil
|
|
|
|
}
|
2024-04-02 06:49:16 +02:00
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2024-04-15 06:57:29 +02:00
|
|
|
func ImportImportFuncs(ctx ExprContext) {
|
2024-06-06 05:31:35 +02:00
|
|
|
ctx.RegisterFunc("import", NewGolangFunctor(importFunc), TypeAny, []ExprFuncParam{
|
|
|
|
NewFuncParamFlag(paramFilepath, PfRepeat),
|
2024-05-22 20:52:44 +02:00
|
|
|
})
|
2024-06-06 05:31:35 +02:00
|
|
|
ctx.RegisterFunc("importAll", NewGolangFunctor(importAllFunc), TypeAny, []ExprFuncParam{
|
|
|
|
NewFuncParamFlag(paramFilepath, PfRepeat),
|
2024-05-22 20:52:44 +02:00
|
|
|
})
|
2024-04-02 06:49:16 +02:00
|
|
|
}
|
2024-04-21 14:24:56 +02:00
|
|
|
|
|
|
|
func init() {
|
2024-04-28 05:41:13 +02:00
|
|
|
registerImport("import", ImportImportFuncs, "Functions import() and include()")
|
2024-04-21 14:24:56 +02:00
|
|
|
}
|