From c7dce8288fb1026057bfee03e6e5331894160916 Mon Sep 17 00:00:00 2001 From: Celestino Amoroso Date: Fri, 8 May 2026 11:01:50 +0200 Subject: [PATCH] file iterators refactored --- builtin-os-file-iter-byte.go | 43 +++++++------------------ builtin-os-file-iter-line.go | 62 +++++++----------------------------- builtin-os-file-iter.go | 39 +++++++++++++++++++++++ 3 files changed, 62 insertions(+), 82 deletions(-) diff --git a/builtin-os-file-iter-byte.go b/builtin-os-file-iter-byte.go index 553140b..1802112 100644 --- a/builtin-os-file-iter-byte.go +++ b/builtin-os-file-iter-byte.go @@ -5,9 +5,6 @@ package expr import ( - "fmt" - "slices" - "git.portale-stac.it/go-pkg/expr/file" "git.portale-stac.it/go-pkg/expr/kern" ) @@ -15,15 +12,14 @@ import ( const fileByteIteratorType = "fileByteIterator" type fileFileByteIterator struct { - reader *file.Reader - index int64 - count int64 - b byte - autoClose bool + fileIterBase + b byte } func newFileByteIterator(r *file.Reader, autoClose bool) *fileFileByteIterator { - return &fileFileByteIterator{reader: r, index: -1, autoClose: autoClose} + return &fileFileByteIterator{ + fileIterBase: fileIterBase{reader: r, index: -1, count: 0, autoClose: autoClose}, + b: 0} } func (it *fileFileByteIterator) TypeName() string { @@ -31,20 +27,12 @@ func (it *fileFileByteIterator) TypeName() string { } func (it *fileFileByteIterator) String() string { - if it.reader.Valid() { - return fmt.Sprintf("$(%s@%q)", fileByteIteratorType, it.reader.GetName()) - } - return fmt.Sprintf("$(%s@)", fileByteIteratorType) -} - -func (it *fileFileByteIterator) Count() int64 { - return it.count + return it.repr(fileByteIteratorType) } func (it *fileFileByteIterator) Next() (item any, err error) { // must return io.EOF after the last item if it.b, err = it.reader.ReadByte(); err == nil { - it.index++ - it.count++ + it.increment() item = it.b } else if it.autoClose { it.Clean() @@ -57,30 +45,23 @@ func (it *fileFileByteIterator) Current() (item any, err error) { return } -func (it *fileFileByteIterator) Index() int64 { - return it.index -} - func (it *fileFileByteIterator) Reset() (err error) { if err = it.reader.Reset(); err == nil { - it.index = -1 - it.count = 0 + it.reset() it.b = 0 } return } -func (it *fileFileByteIterator) HasOperation(name string) bool { - return slices.Contains([]string{kern.NextName, kern.ResetName, kern.IndexName, kern.CountName, kern.CurrentName, kern.CleanName}, name) -} - func (it *fileFileByteIterator) Clean() (err error) { if it.reader.Valid() { if err = it.reader.GetFile().Close(); err == nil { it.reader = nil } } - return nil + it.reset() + it.b = 0 + return } func (it *fileFileByteIterator) CallOperation(name string, args map[string]any) (v any, err error) { @@ -108,8 +89,6 @@ func fileByteIteratorFunc(ctx kern.ExprContext, name string, args map[string]any var invalidFileHandle any var autoClose bool - result = nil - if handle, invalidFileHandle, autoClose, err = initFileHandle(ctx, name, args); err == nil { if handle != nil { result = newFileByteIterator(handle, autoClose) diff --git a/builtin-os-file-iter-line.go b/builtin-os-file-iter-line.go index 587c236..ca57e01 100644 --- a/builtin-os-file-iter-line.go +++ b/builtin-os-file-iter-line.go @@ -5,9 +5,6 @@ package expr import ( - "fmt" - "slices" - "git.portale-stac.it/go-pkg/expr/file" "git.portale-stac.it/go-pkg/expr/kern" ) @@ -15,15 +12,15 @@ import ( const fileLineIteratorType = "fileLineIterator" type fileFileLineIterator struct { - reader *file.Reader - index int64 - count int64 - line string - autoClose bool + fileIterBase + line string } func newFileLineIterator(r *file.Reader, autoClose bool) *fileFileLineIterator { - return &fileFileLineIterator{reader: r, index: -1, autoClose: autoClose} + return &fileFileLineIterator{ + fileIterBase: fileIterBase{reader: r, index: -1, count: 0, autoClose: autoClose}, + line: "", + } } func (it *fileFileLineIterator) TypeName() string { @@ -31,20 +28,12 @@ func (it *fileFileLineIterator) TypeName() string { } func (it *fileFileLineIterator) String() string { - if it.reader != nil && it.reader.GetFile() != nil { - return fmt.Sprintf("$(%s@%q)", fileLineIteratorType, it.reader.GetName()) - } - return fmt.Sprintf("$(%s@)", fileLineIteratorType) -} - -func (it *fileFileLineIterator) Count() int64 { - return it.count + return it.repr(fileLineIteratorType) } func (it *fileFileLineIterator) Next() (item any, err error) { // must return io.EOF after the last item if it.line, err = it.reader.ReadString('\n'); err == nil { - it.index++ - it.count++ + it.increment() item = it.line[0 : len(it.line)-1] } else if it.autoClose { it.Clean() @@ -59,30 +48,23 @@ func (it *fileFileLineIterator) Current() (item any, err error) { return } -func (it *fileFileLineIterator) Index() int64 { - return it.index -} - func (it *fileFileLineIterator) Reset() (err error) { if err = it.reader.Reset(); err == nil { - it.index = -1 - it.count = 0 + it.reset() it.line = "" } return } -func (it *fileFileLineIterator) HasOperation(name string) bool { - return slices.Contains([]string{kern.NextName, kern.ResetName, kern.IndexName, kern.CountName, kern.CurrentName, kern.CleanName}, name) -} - func (it *fileFileLineIterator) Clean() (err error) { if it.reader != nil { if err = it.reader.Close(); err == nil { it.reader = nil } } - return nil + it.reset() + it.line = "" + return } func (it *fileFileLineIterator) CallOperation(name string, args map[string]any) (v any, err error) { @@ -110,26 +92,6 @@ func fileLineIteratorFunc(ctx kern.ExprContext, name string, args map[string]any var invalidFileHandle any var autoClose bool - result = nil - // if handle, ok = args[paramHandleOrPath].(*osReader); !ok { - // if fileName, ok := args[paramHandleOrPath].(string); ok && len(fileName) > 0 { - // var handleAny any - // if handleAny, err = openFileFunc(ctx, name, map[string]any{kern.ParamFilepath: fileName}); err != nil { - // return - // } - // if handleAny != nil { - // handle = handleAny.(*osReader) - // autoClose = true - // } - // } else { - // invalidFileHandle = args[paramHandleOrPath] - // } - // } - - // if handle != nil { - // result = newFileLineIterator(handle, autoClose) - // } - if handle, invalidFileHandle, autoClose, err = initFileHandle(ctx, name, args); err == nil { if handle != nil { result = newFileLineIterator(handle, autoClose) diff --git a/builtin-os-file-iter.go b/builtin-os-file-iter.go index c2c1b9a..d2db1ed 100644 --- a/builtin-os-file-iter.go +++ b/builtin-os-file-iter.go @@ -5,12 +5,51 @@ package expr import ( + "fmt" + "slices" + "git.portale-stac.it/go-pkg/expr/file" "git.portale-stac.it/go-pkg/expr/kern" ) const paramHandleOrPath = "handle-or-path" +type fileIterBase struct { + reader *file.Reader + index int64 + count int64 + autoClose bool +} + +func (it *fileIterBase) Count() int64 { + return it.count +} + +func (it *fileIterBase) Index() int64 { + return it.index +} + +func (it *fileIterBase) HasOperation(name string) bool { + return slices.Contains([]string{kern.NextName, kern.ResetName, kern.IndexName, kern.CountName, kern.CurrentName, kern.CleanName}, name) +} + +func (it *fileIterBase) reset() { + it.index = -1 + it.count = 0 +} + +func (it *fileIterBase) increment() { + it.index++ + it.count++ +} + +func (it *fileIterBase) repr(typeName string) string { + if it.reader.Valid() { + return fmt.Sprintf("$(%s@%q)", fileLineIteratorType, it.reader.GetName()) + } + return fmt.Sprintf("$(%s@)", fileLineIteratorType) +} + func initFileHandle(ctx kern.ExprContext, name string, args map[string]any) (handle *file.Reader, invalidFileHandle any, autoClose bool, err error) { var ok bool