file iterators refactored
This commit is contained in:
@@ -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@<nil>)", 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)
|
||||
|
||||
Reference in New Issue
Block a user