From 20d8236325d3d9897cd71ac2ff5c44792111f76b Mon Sep 17 00:00:00 2001 From: Celestino Amoroso Date: Fri, 24 Apr 2026 06:26:00 +0200 Subject: [PATCH] Iterators: Removed NewAnyIterator(), added NewIterator() --- dict-iterator.go | 16 ++++++++-------- iter-factory.go | 27 +++++++++++++++++++++++++++ list-iterator.go | 17 +---------------- operator-builtin.go | 5 ++++- plugins.go | 6 ++++-- t_iter-list_test.go | 16 ++++++++-------- 6 files changed, 52 insertions(+), 35 deletions(-) create mode 100644 iter-factory.go diff --git a/dict-iterator.go b/dict-iterator.go index adb72ea..442be81 100644 --- a/dict-iterator.go +++ b/dict-iterator.go @@ -70,7 +70,7 @@ func NewDictIterator(dict *DictType, args []any) (it *DictIterator, err error) { var s string var argAny any - it = &DictIterator{a: dict, count: 0, index: -1, keys: nil, iterMode: dictIterModeKeys} + dictIt := &DictIterator{a: dict, count: 0, index: -1, keys: nil, iterMode: dictIterModeKeys} if len(args) > 0 { argAny = args[0] } else { @@ -100,13 +100,13 @@ func NewDictIterator(dict *DictType, args []any) (it *DictIterator, err error) { if s, err = ToGoString(argAny, "iteration mode"); err == nil { switch strings.ToLower(s) { case "k", "key", "keys": - it.iterMode = dictIterModeKeys + dictIt.iterMode = dictIterModeKeys case "v", "value", "values": - it.iterMode = dictIterModeValues + dictIt.iterMode = dictIterModeValues case "i", "item", "items": - it.iterMode = dictIterModeItems + dictIt.iterMode = dictIterModeItems case "", "default": - it.iterMode = dictIterModeKeys + dictIt.iterMode = dictIterModeKeys default: err = fmt.Errorf("invalid iteration mode %q", s) } @@ -114,8 +114,8 @@ func NewDictIterator(dict *DictType, args []any) (it *DictIterator, err error) { } } - it.makeKeys(*dict, sortType) - return + dictIt.makeKeys(*dict, sortType) + return dictIt, err } func NewMapIterator(m map[any]any) (it *DictIterator) { @@ -129,7 +129,7 @@ func (it *DictIterator) String() string { if it.a != nil { l = len(*it.a) } - return fmt.Sprintf("$(#%d)", l) + return fmt.Sprintf("$({#%d})", l) } func (it *DictIterator) TypeName() string { diff --git a/iter-factory.go b/iter-factory.go new file mode 100644 index 0000000..1109257 --- /dev/null +++ b/iter-factory.go @@ -0,0 +1,27 @@ +// Copyright (c) 2024 Celestino Amoroso (celestino.amoroso@gmail.com). +// All rights reserved. + +// iter-factory.go +package expr + +func NewIterator(value any) (it Iterator, err error) { + if value == nil { + return NewArrayIterator([]any{}), nil + } + + switch v := value.(type) { + case *ListType: + it = NewListIterator(v, nil) + case *DictType: + it, err = NewDictIterator(v, nil) + case []any: + it = NewArrayIterator(v) + case *ListIterator: + it = v + case *DictIterator: + it = v + default: + it = NewArrayIterator([]any{value}) + } + return +} diff --git a/list-iterator.go b/list-iterator.go index 01e36fd..4c108f9 100644 --- a/list-iterator.go +++ b/list-iterator.go @@ -62,27 +62,12 @@ func NewArrayIterator(array []any) (it *ListIterator) { return } -func NewAnyIterator(value any) (it *ListIterator) { - if value == nil { - it = NewArrayIterator([]any{}) - } else if list, ok := value.(*ListType); ok { - it = NewListIterator(list, nil) - } else if array, ok := value.([]any); ok { - it = NewArrayIterator(array) - } else if it1, ok := value.(*ListIterator); ok { - it = it1 - } else { - it = NewArrayIterator([]any{value}) - } - return -} - func (it *ListIterator) String() string { var l = 0 if it.a != nil { l = len(*it.a) } - return fmt.Sprintf("$(#%d)", l) + return fmt.Sprintf("$([#%d])", l) } func (it *ListIterator) TypeName() string { diff --git a/operator-builtin.go b/operator-builtin.go index 8c0eda3..38044e7 100644 --- a/operator-builtin.go +++ b/operator-builtin.go @@ -31,7 +31,10 @@ func evalBuiltin(ctx ExprContext, opTerm *term) (v any, err error) { count, err = ImportInContextByGlobPattern(module) } else { var moduleSpec any - it := NewAnyIterator(childValue) + var it Iterator + if it, err = NewIterator(childValue); err != nil { + return + } for moduleSpec, err = it.Next(); err == nil; moduleSpec, err = it.Next() { if module, ok := moduleSpec.(string); ok { if ImportInContext(module) { diff --git a/plugins.go b/plugins.go index f7bf85d..26374c7 100644 --- a/plugins.go +++ b/plugins.go @@ -93,10 +93,12 @@ func importPlugin( /*ctx ExprContext,*/ dirList []string, name string) (err erro func importPluginFromSearchPath(name any) (count int, err error) { var moduleSpec any - + var it Iterator dirList := buildSearchDirList("plugin", ENV_EXPR_PLUGIN_PATH) count = 0 - it := NewAnyIterator(name) + if it, err = NewIterator(name); err != nil { + return + } for moduleSpec, err = it.Next(); err == nil; moduleSpec, err = it.Next() { if module, ok := moduleSpec.(string); ok { if err = importPlugin(dirList, module); err != nil { diff --git a/t_iter-list_test.go b/t_iter-list_test.go index 3f49b53..c26088e 100644 --- a/t_iter-list_test.go +++ b/t_iter-list_test.go @@ -59,7 +59,7 @@ func TestNewIterList2(t *testing.T) { func TestNewIterList3(t *testing.T) { list := []any{"a", "b", "c", "d"} - it := NewAnyIterator(list) + it, _ := NewIterator(list) if item, err := it.Next(); err != nil { t.Errorf("error: %v", err) } else if item != "a" { @@ -71,7 +71,7 @@ func TestNewIterList3(t *testing.T) { func TestNewIterList4(t *testing.T) { list := any(nil) - it := NewAnyIterator(list) + it, _ := NewIterator(list) if _, err := it.Next(); err != io.EOF { t.Errorf("error: %v", err) } @@ -79,7 +79,7 @@ func TestNewIterList4(t *testing.T) { func TestNewIterList5(t *testing.T) { list := "123" - it := NewAnyIterator(list) + it, _ := NewIterator(list) if item, err := it.Next(); err != nil { t.Errorf("error: %v", err) } else if item != "123" { @@ -91,8 +91,8 @@ func TestNewIterList5(t *testing.T) { func TestNewIterList6(t *testing.T) { list := newListA("a", "b", "c", "d") - it1 := NewAnyIterator(list) - it := NewAnyIterator(it1) + it1, _ := NewIterator(list) + it, _ := NewIterator(it1) if item, err := it.Next(); err != nil { t.Errorf("error: %v", err) } else if item != "a" { @@ -103,9 +103,9 @@ func TestNewIterList6(t *testing.T) { } func TestNewString(t *testing.T) { list := "123" - it := NewAnyIterator(list) - if s := it.String(); s != "$(#1)" { - t.Errorf("expected $(#1), got %s", s) + it, _ := NewIterator(list) + if s := it.String(); s != "$([#1])" { + t.Errorf("expected $([#1]), got %s", s) } }