dict: implemented sub-field access, e.g D=["sub-dict"]["sub-field"]

This commit is contained in:
2026-05-17 18:57:27 +02:00
parent 1bf8015da1
commit d34b9d8a48
3 changed files with 11 additions and 7 deletions
+3 -1
View File
@@ -6,6 +6,7 @@ package expr
import (
"errors"
"slices"
"git.portale-stac.it/go-pkg/expr/scan"
"golang.org/x/exp/constraints"
@@ -401,7 +402,8 @@ func couldBeACollection(t *scan.Term) bool {
if t != nil {
sym = t.Symbol()
}
return sym == scan.SymList || sym == scan.SymString || sym == scan.SymDict || sym == scan.SymExpression || sym == scan.SymVariable
// return sym == scan.SymList || sym == scan.SymString || sym == scan.SymDict || sym == scan.SymExpression || sym == scan.SymVariable
return slices.Contains([]scan.Symbol{scan.SymList, scan.SymString, scan.SymDict, scan.SymExpression, scan.SymVariable, scan.SymIndex}, sym)
}
func listSubTree(tree *scan.Ast, listTerm *scan.Term, allowIndeces bool) (root *scan.Term, err error) {
+4 -4
View File
@@ -46,7 +46,7 @@ func TestDictParser(t *testing.T) {
runTestSuite(t, section, inputs)
}
func _TestPoc(t *testing.T) {
func TestPoc(t *testing.T) {
section := "Dict-Assign-Item"
ctx := NewSimpleStore()
ctx.UnsafeSetVar(
@@ -62,10 +62,10 @@ func _TestPoc(t *testing.T) {
inputs := []inputType{
/* 1 */ {`D.a.uno`, int64(10), nil},
/* 2 */ {`D.a.uno = 111; D.a."uno"`, int64(111), nil},
/* 3 */ {`D["a"]["uno"]`, int64(111), nil},
/* 3 */ {`D.a.uno = 111; D["a"]["uno"]`, int64(111), nil},
}
runCtxTestSuiteSpec(t, ctx, section, inputs, 3)
// runCtxTestSuite(t, ctx, section, inputs)
// runCtxTestSuiteSpec(t, ctx, section, inputs, 3)
runCtxTestSuite(t, ctx, section, inputs)
}
func TestDictToStringMultiLine(t *testing.T) {
+4 -2
View File
@@ -6,19 +6,21 @@ package expr
import (
"testing"
"git.portale-stac.it/go-pkg/expr/kern"
)
func TestCollections(t *testing.T) {
section := "Collection"
section := "Index"
inputs := []inputType{
/* 1 */ {`"abcdef"[1:3]`, "bc", nil},
/* 2 */ {`"abcdef"[:3]`, "abc", nil},
/* 3 */ {`"abcdef"[1:]`, "bcdef", nil},
/* 4 */ {`"abcdef"[:]`, "abcdef", nil},
// /* 5 */ {`[0,1,2,3,4][:]`, ListType{int64(0), int64(1), int64(2), int64(3), int64(4)}, nil},
/* 5 */ {`"abcdef"[1:2:3]`, nil, `[1:14] invalid range specification`},
/* 6 */ {`"abcdef"[((1>0)?{1}:{0}):3]`, "bc", nil},
/* 7 */ {`"abcdef"[[0,1][0]:1]`, "a", nil},
/* 8 */ {`[0,1,2,3,4][:]`, kern.NewListA(int64(0), int64(1), int64(2), int64(3), int64(4)), nil},
}
t.Setenv("EXPR_PATH", ".")