improved the string representation of the content
This commit is contained in:
parent
8d9963207e
commit
02b7a6df6c
@ -4,7 +4,10 @@
|
|||||||
// simple-func-store.go
|
// simple-func-store.go
|
||||||
package expr
|
package expr
|
||||||
|
|
||||||
import "fmt"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
type SimpleFuncStore struct {
|
type SimpleFuncStore struct {
|
||||||
SimpleVarStore
|
SimpleVarStore
|
||||||
@ -18,6 +21,29 @@ type funcInfo struct {
|
|||||||
functor Functor
|
functor Functor
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (info *funcInfo) ToString(opt FmtOpt) string {
|
||||||
|
var sb strings.Builder
|
||||||
|
var i int
|
||||||
|
sb.WriteString("func(")
|
||||||
|
for i = 0; i < info.minArgs; i++ {
|
||||||
|
if i > 0 {
|
||||||
|
sb.WriteString(", ")
|
||||||
|
}
|
||||||
|
sb.WriteString(fmt.Sprintf("arg%d", i+1))
|
||||||
|
}
|
||||||
|
for ; i < info.maxArgs; i++ {
|
||||||
|
sb.WriteString(fmt.Sprintf("arg%d", i+1))
|
||||||
|
}
|
||||||
|
if info.maxArgs < 0 {
|
||||||
|
if info.minArgs > 0 {
|
||||||
|
sb.WriteString(", ")
|
||||||
|
}
|
||||||
|
sb.WriteString("...")
|
||||||
|
}
|
||||||
|
sb.WriteString(") {...}")
|
||||||
|
return sb.String()
|
||||||
|
}
|
||||||
|
|
||||||
func (info *funcInfo) Name() string {
|
func (info *funcInfo) Name() string {
|
||||||
return info.name
|
return info.name
|
||||||
}
|
}
|
||||||
@ -52,6 +78,36 @@ func (ctx *SimpleFuncStore) Clone() ExprContext {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func funcsCtxToBuilder(sb *strings.Builder, ctx ExprContext, indent int) {
|
||||||
|
sb.WriteString("funcs: {\n")
|
||||||
|
first := true
|
||||||
|
for _, name := range ctx.EnumFuncs(func(name string) bool { return true }) {
|
||||||
|
if first {
|
||||||
|
first = false
|
||||||
|
} else {
|
||||||
|
sb.WriteByte(',')
|
||||||
|
sb.WriteByte('\n')
|
||||||
|
}
|
||||||
|
value, _ := ctx.GetFuncInfo(name)
|
||||||
|
sb.WriteString(strings.Repeat("\t", indent+1))
|
||||||
|
sb.WriteString(name)
|
||||||
|
sb.WriteString("=")
|
||||||
|
if formatter, ok := value.(Formatter); ok {
|
||||||
|
sb.WriteString(formatter.ToString(0))
|
||||||
|
} else {
|
||||||
|
sb.WriteString(fmt.Sprintf("%v", value))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
sb.WriteString("\n}\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ctx *SimpleFuncStore) ToString(opt FmtOpt) string {
|
||||||
|
var sb strings.Builder
|
||||||
|
sb.WriteString(ctx.SimpleVarStore.ToString(opt))
|
||||||
|
funcsCtxToBuilder(&sb, ctx, 0)
|
||||||
|
return sb.String()
|
||||||
|
}
|
||||||
|
|
||||||
func (ctx *SimpleFuncStore) GetFuncInfo(name string) (info ExprFunc, exists bool) {
|
func (ctx *SimpleFuncStore) GetFuncInfo(name string) (info ExprFunc, exists bool) {
|
||||||
info, exists = ctx.funcStore[name]
|
info, exists = ctx.funcStore[name]
|
||||||
return
|
return
|
||||||
|
@ -79,34 +79,43 @@ func (ctx *SimpleVarStore) EnumFuncs(acceptor func(name string) (accept bool)) (
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func CtxToBuilder(sb *strings.Builder, ctx ExprContext, indent int) {
|
func varsCtxToBuilder(sb *strings.Builder, ctx ExprContext, indent int) {
|
||||||
sb.WriteString("{\n")
|
sb.WriteString("vars: {\n")
|
||||||
first := true
|
first := true
|
||||||
for _, name := range ctx.EnumVars(func(name string) bool { return name[0] != '_' }) {
|
for _, name := range ctx.EnumVars(func(name string) bool { return name[0] != '_' }) {
|
||||||
|
if first {
|
||||||
|
first = false
|
||||||
|
} else {
|
||||||
|
sb.WriteByte(',')
|
||||||
|
sb.WriteByte('\n')
|
||||||
|
}
|
||||||
|
|
||||||
value, _ := ctx.GetVar(name)
|
value, _ := ctx.GetVar(name)
|
||||||
sb.WriteString(strings.Repeat("\t", indent+1))
|
sb.WriteString(strings.Repeat("\t", indent+1))
|
||||||
sb.WriteString(name)
|
sb.WriteString(name)
|
||||||
sb.WriteString("=")
|
sb.WriteString(": ")
|
||||||
if _, ok := value.(Functor); ok {
|
if f, ok := value.(Formatter); ok {
|
||||||
sb.WriteString(": func(){}")
|
sb.WriteString(f.ToString(0))
|
||||||
|
} else if _, ok = value.(Functor); ok {
|
||||||
|
sb.WriteString("func(){}")
|
||||||
} else if _, ok = value.(map[any]any); ok {
|
} else if _, ok = value.(map[any]any); ok {
|
||||||
sb.WriteString("dict{}")
|
sb.WriteString("dict{}")
|
||||||
} else {
|
} else {
|
||||||
sb.WriteString(fmt.Sprintf("%v", value))
|
sb.WriteString(fmt.Sprintf("%v", value))
|
||||||
}
|
}
|
||||||
if first {
|
|
||||||
first = false
|
|
||||||
} else {
|
|
||||||
sb.WriteByte(',')
|
|
||||||
}
|
|
||||||
sb.WriteByte('\n')
|
|
||||||
}
|
}
|
||||||
sb.WriteString(strings.Repeat("\t", indent))
|
sb.WriteString(strings.Repeat("\t", indent))
|
||||||
sb.WriteString("}\n")
|
sb.WriteString("\n}\n")
|
||||||
}
|
}
|
||||||
|
|
||||||
func CtxToString(ctx ExprContext, indent int) string {
|
func varsCtxToString(ctx ExprContext, indent int) string {
|
||||||
var sb strings.Builder
|
var sb strings.Builder
|
||||||
CtxToBuilder(&sb, ctx, indent)
|
varsCtxToBuilder(&sb, ctx, indent)
|
||||||
|
return sb.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ctx *SimpleVarStore) ToString(opt FmtOpt) string {
|
||||||
|
var sb strings.Builder
|
||||||
|
varsCtxToBuilder(&sb, ctx, 0)
|
||||||
return sb.String()
|
return sb.String()
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user