data-cursor.go: deep changes to better handle the data-source

This commit is contained in:
Celestino Amoroso 2024-05-01 05:59:54 +02:00
parent cdbe3dfc22
commit 52fb398cd8

View File

@ -6,7 +6,9 @@ package expr
import ( import (
"errors" "errors"
"fmt"
"io" "io"
"strings"
) )
const ( const (
@ -37,8 +39,31 @@ func newDataCursor(ctx ExprContext, ds map[string]Functor) (dc *dataCursor) {
return return
} }
func mapToString(m map[string]Functor) string {
var sb strings.Builder
sb.WriteByte('{')
for key, _ := range m {
if sb.Len() > 1 {
sb.WriteString(fmt.Sprintf(", %q: func(){}", key))
} else {
sb.WriteString(fmt.Sprintf("%q: func(){}", key))
}
}
sb.WriteByte('}')
return sb.String()
}
func (dc *dataCursor) String() string { func (dc *dataCursor) String() string {
return "$(...)" return "$()"
/* var sb strings.Builder
sb.WriteString(fmt.Sprintf(`$(
index: %d,
ds: %s,
ctx: `, dc.index, mapToString(dc.ds)))
CtxToBuilder(&sb, dc.ctx, 1)
sb.WriteByte(')')
return sb.String()
*/
} }
func (dc *dataCursor) HasOperation(name string) (exists bool) { func (dc *dataCursor) HasOperation(name string) (exists bool) {
@ -47,11 +72,17 @@ func (dc *dataCursor) HasOperation(name string) (exists bool) {
return return
} }
func (dc *dataCursor) CallOperation(name string) (value any, err error) { func (dc *dataCursor) CallOperation(name string, args []any) (value any, err error) {
if functor, ok := dc.ds[name]; ok && isFunctor(functor) { if functor, ok := dc.ds[name]; ok && isFunctor(functor) {
ctx := cloneContext(dc.ctx) if functor == dc.cleanFunc {
value, err = functor.Invoke(ctx, name, []any{}) return nil, dc.Clean()
exportObjects(dc.ctx, ctx) } else if functor == dc.resetFunc {
return nil, dc.Reset()
} else {
ctx := cloneContext(dc.ctx)
value, err = functor.Invoke(ctx, name, []any{})
exportObjects(dc.ctx, ctx)
}
} else { } else {
err = errNoOperation(name) err = errNoOperation(name)
@ -61,22 +92,31 @@ func (dc *dataCursor) CallOperation(name string) (value any, err error) {
func (dc *dataCursor) Reset() (err error) { func (dc *dataCursor) Reset() (err error) {
if dc.resetFunc != nil { if dc.resetFunc != nil {
ctx := cloneContext(dc.ctx) if dc.resource != nil {
if _, err = dc.resetFunc.Invoke(ctx, resetName, []any{}); err == nil { ctx := cloneContext(dc.ctx)
dc.index = -1 if _, err = dc.resetFunc.Invoke(ctx, resetName, []any{dc.resource}); err == nil {
dc.index = -1
}
exportObjects(dc.ctx, ctx)
} else {
err = errInvalidDataSource()
} }
exportObjects(dc.ctx, ctx)
} else { } else {
err = errors.New("no 'reset' function defined in the data-source") err = errNoOperation(resetName)
} }
return return
} }
func (dc *dataCursor) Clean() (err error) { func (dc *dataCursor) Clean() (err error) {
if dc.cleanFunc != nil { if dc.cleanFunc != nil {
ctx := cloneContext(dc.ctx) if dc.resource != nil {
_, err = dc.cleanFunc.Invoke(ctx, cleanName, []any{}) ctx := cloneContext(dc.ctx)
exportObjects(dc.ctx, ctx) _, err = dc.cleanFunc.Invoke(ctx, cleanName, []any{dc.resource})
dc.resource = nil
exportObjects(dc.ctx, ctx)
} else {
err = errInvalidDataSource()
}
} else { } else {
err = errors.New("no 'clean' function defined in the data-source") err = errors.New("no 'clean' function defined in the data-source")
} }
@ -93,15 +133,22 @@ func (dc *dataCursor) Current() (item any, err error) { // must return io.EOF at
} }
func (dc *dataCursor) Next() (item any, err error) { // must return io.EOF after the last item func (dc *dataCursor) Next() (item any, err error) { // must return io.EOF after the last item
ctx := cloneContext(dc.ctx) if dc.resource != nil {
if item, err = dc.nextFunc.Invoke(ctx, nextName, []any{}); err == nil { ctx := cloneContext(dc.ctx)
if item == nil { // fmt.Printf("Entering Inner-Ctx [%p]: %s\n", ctx, CtxToString(ctx, 0))
err = io.EOF if item, err = dc.nextFunc.Invoke(ctx, nextName, []any{dc.resource}); err == nil {
} else { if item == nil {
dc.index++ err = io.EOF
} else {
dc.index++
}
} }
// fmt.Printf("Exiting Inner-Ctx [%p]: %s\n", ctx, CtxToString(ctx, 0))
exportObjects(dc.ctx, ctx)
// fmt.Printf("Outer-Ctx [%p]: %s\n", dc.ctx, CtxToString(dc.ctx, 0))
} else {
err = errInvalidDataSource()
} }
exportObjects(dc.ctx, ctx)
return return
} }