Also changed and exported some identiefier relatet to the builtin feature
144 lines
2.9 KiB
Go
144 lines
2.9 KiB
Go
// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com).
|
|
// All rights reserved.
|
|
|
|
// global-context.go
|
|
package expr
|
|
|
|
import (
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
var globalCtx *SimpleStore
|
|
|
|
func ImportInContext(name string) (exists bool) {
|
|
var mod *builtinModule
|
|
if mod, exists = builtinModuleRegister[name]; exists {
|
|
mod.importFunc(globalCtx)
|
|
mod.imported = true
|
|
}
|
|
return
|
|
}
|
|
|
|
func ImportInContextByGlobPattern(pattern string) (count int, err error) {
|
|
var matched bool
|
|
for name, mod := range builtinModuleRegister {
|
|
if matched, err = filepath.Match(pattern, name); err == nil {
|
|
if matched {
|
|
count++
|
|
mod.importFunc(globalCtx)
|
|
mod.imported = true
|
|
}
|
|
} else {
|
|
break
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func GetVar(ctx ExprContext, name string) (value any, exists bool) {
|
|
if value, exists = ctx.GetVar(name); !exists {
|
|
value, exists = globalCtx.GetVar(name)
|
|
}
|
|
return
|
|
}
|
|
|
|
func GetLocalFuncInfo(ctx ExprContext, name string) (item ExprFunc, exists bool) {
|
|
var v any
|
|
if len(name) > 0 {
|
|
if v, exists = ctx.GetVar(name); exists && isFunctor(v) {
|
|
f, _ := v.(Functor)
|
|
item = f.GetFunc()
|
|
} else {
|
|
item, exists = ctx.GetFuncInfo(name)
|
|
}
|
|
}
|
|
return
|
|
}
|
|
func GetFuncInfo(ctx ExprContext, name string) (item ExprFunc, exists bool, ownerCtx ExprContext) {
|
|
if len(name) > 0 {
|
|
if item, exists = GetLocalFuncInfo(ctx, name); exists {
|
|
ownerCtx = ctx
|
|
} else if item, exists = globalCtx.GetFuncInfo(name); exists {
|
|
ownerCtx = globalCtx
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func GlobalCtrlSet(name string, newValue any) (currentValue any) {
|
|
if !strings.HasPrefix(name, "_") {
|
|
name = "_" + name
|
|
}
|
|
currentValue, _ = globalCtx.GetVar(name)
|
|
|
|
globalCtx.SetVar(name, newValue)
|
|
return currentValue
|
|
}
|
|
|
|
func GlobalCtrlGet(name string) (currentValue any) {
|
|
if !strings.HasPrefix(name, "_") {
|
|
name = "_" + name
|
|
}
|
|
currentValue, _ = globalCtx.GetVar(name)
|
|
return currentValue
|
|
}
|
|
|
|
func CtrlEnable(ctx ExprContext, name string) (currentStatus bool) {
|
|
if !strings.HasPrefix(name, "_") {
|
|
name = "_" + name
|
|
}
|
|
if v, exists := ctx.GetVar(name); exists && IsBool(v) {
|
|
currentStatus, _ = v.(bool)
|
|
}
|
|
|
|
ctx.SetVar(name, true)
|
|
return currentStatus
|
|
}
|
|
|
|
func CtrlDisable(ctx ExprContext, name string) (currentStatus bool) {
|
|
if !strings.HasPrefix(name, "_") {
|
|
name = "_" + name
|
|
}
|
|
if v, exists := ctx.GetVar(name); exists && IsBool(v) {
|
|
currentStatus, _ = v.(bool)
|
|
}
|
|
|
|
ctx.SetVar(name, false)
|
|
return currentStatus
|
|
}
|
|
|
|
func CtrlIsEnabled(ctx ExprContext, name string) (status bool) {
|
|
var v any
|
|
var exists bool
|
|
|
|
if !strings.HasPrefix(name, "_") {
|
|
name = "_" + name
|
|
}
|
|
|
|
if v, exists = ctx.GetVar(name); !exists {
|
|
v, exists = globalCtx.GetVar(name)
|
|
}
|
|
|
|
if exists {
|
|
if b, ok := v.(bool); ok {
|
|
status = b
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func getControlString(name string) (s string, exists bool) {
|
|
var v any
|
|
if v, exists = globalCtx.GetVar(name); exists {
|
|
s, exists = v.(string)
|
|
}
|
|
return
|
|
}
|
|
|
|
func init() {
|
|
globalCtx = NewSimpleStore()
|
|
initDefaultVars(globalCtx)
|
|
ImportBuiltinsFuncs(globalCtx)
|
|
}
|