2024-04-27 06:12:30 +02:00
|
|
|
// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com).
|
|
|
|
// All rights reserved.
|
|
|
|
|
|
|
|
// operator-context-value.go
|
|
|
|
package expr
|
|
|
|
|
|
|
|
//-------- context term
|
|
|
|
|
|
|
|
func newContextTerm(tk *Token) (inst *term) {
|
|
|
|
return &term{
|
|
|
|
tk: *tk,
|
|
|
|
children: make([]*term, 0, 1),
|
|
|
|
position: posPrefix,
|
2024-05-06 04:14:54 +02:00
|
|
|
priority: priIncDec,
|
2024-04-27 06:12:30 +02:00
|
|
|
evalFunc: evalContextValue,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
func evalContextValue(ctx ExprContext, self *term) (v any, err error) {
|
|
|
|
var childValue any
|
|
|
|
|
|
|
|
var sourceCtx ExprContext
|
2024-05-22 20:52:44 +02:00
|
|
|
if self.children == nil || len(self.children) == 0 {
|
2024-04-27 06:12:30 +02:00
|
|
|
sourceCtx = ctx
|
2024-05-22 20:52:44 +02:00
|
|
|
} else if self.children[0].symbol() == SymVariable && self.children[0].source() == "global" {
|
|
|
|
sourceCtx = globalCtx
|
2024-04-27 06:12:30 +02:00
|
|
|
} else if childValue, err = self.evalPrefix(ctx); err == nil {
|
|
|
|
if dc, ok := childValue.(*dataCursor); ok {
|
|
|
|
sourceCtx = dc.ctx
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if sourceCtx != nil {
|
2024-05-22 20:52:44 +02:00
|
|
|
if formatter, ok := sourceCtx.(Formatter); ok {
|
2024-05-03 06:31:36 +02:00
|
|
|
v = formatter.ToString(0)
|
|
|
|
} else {
|
2024-06-07 14:39:17 +02:00
|
|
|
// keys := sourceCtx.EnumVars(func(name string) bool { return name[0] != '_' })
|
|
|
|
keys := sourceCtx.EnumVars(nil)
|
2024-05-03 06:31:36 +02:00
|
|
|
d := make(map[string]any)
|
|
|
|
for _, key := range keys {
|
|
|
|
d[key], _ = sourceCtx.GetVar(key)
|
|
|
|
}
|
|
|
|
keys = sourceCtx.EnumFuncs(func(name string) bool { return true })
|
|
|
|
for _, key := range keys {
|
|
|
|
d[key], _ = sourceCtx.GetFuncInfo(key)
|
|
|
|
}
|
|
|
|
v = d
|
2024-04-27 06:12:30 +02:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
err = self.errIncompatibleType(childValue)
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
// init
|
|
|
|
func init() {
|
|
|
|
registerTermConstructor(SymDoubleDollar, newContextTerm)
|
|
|
|
}
|