file iterators refactored
This commit is contained in:
@@ -5,9 +5,6 @@
|
|||||||
package expr
|
package expr
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"slices"
|
|
||||||
|
|
||||||
"git.portale-stac.it/go-pkg/expr/file"
|
"git.portale-stac.it/go-pkg/expr/file"
|
||||||
"git.portale-stac.it/go-pkg/expr/kern"
|
"git.portale-stac.it/go-pkg/expr/kern"
|
||||||
)
|
)
|
||||||
@@ -15,15 +12,14 @@ import (
|
|||||||
const fileByteIteratorType = "fileByteIterator"
|
const fileByteIteratorType = "fileByteIterator"
|
||||||
|
|
||||||
type fileFileByteIterator struct {
|
type fileFileByteIterator struct {
|
||||||
reader *file.Reader
|
fileIterBase
|
||||||
index int64
|
b byte
|
||||||
count int64
|
|
||||||
b byte
|
|
||||||
autoClose bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func newFileByteIterator(r *file.Reader, autoClose bool) *fileFileByteIterator {
|
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 {
|
func (it *fileFileByteIterator) TypeName() string {
|
||||||
@@ -31,20 +27,12 @@ func (it *fileFileByteIterator) TypeName() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (it *fileFileByteIterator) String() string {
|
func (it *fileFileByteIterator) String() string {
|
||||||
if it.reader.Valid() {
|
return it.repr(fileByteIteratorType)
|
||||||
return fmt.Sprintf("$(%s@%q)", fileByteIteratorType, it.reader.GetName())
|
|
||||||
}
|
|
||||||
return fmt.Sprintf("$(%s@<nil>)", fileByteIteratorType)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (it *fileFileByteIterator) Count() int64 {
|
|
||||||
return it.count
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (it *fileFileByteIterator) Next() (item any, err error) { // must return io.EOF after the last item
|
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 {
|
if it.b, err = it.reader.ReadByte(); err == nil {
|
||||||
it.index++
|
it.increment()
|
||||||
it.count++
|
|
||||||
item = it.b
|
item = it.b
|
||||||
} else if it.autoClose {
|
} else if it.autoClose {
|
||||||
it.Clean()
|
it.Clean()
|
||||||
@@ -57,30 +45,23 @@ func (it *fileFileByteIterator) Current() (item any, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (it *fileFileByteIterator) Index() int64 {
|
|
||||||
return it.index
|
|
||||||
}
|
|
||||||
|
|
||||||
func (it *fileFileByteIterator) Reset() (err error) {
|
func (it *fileFileByteIterator) Reset() (err error) {
|
||||||
if err = it.reader.Reset(); err == nil {
|
if err = it.reader.Reset(); err == nil {
|
||||||
it.index = -1
|
it.reset()
|
||||||
it.count = 0
|
|
||||||
it.b = 0
|
it.b = 0
|
||||||
}
|
}
|
||||||
return
|
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) {
|
func (it *fileFileByteIterator) Clean() (err error) {
|
||||||
if it.reader.Valid() {
|
if it.reader.Valid() {
|
||||||
if err = it.reader.GetFile().Close(); err == nil {
|
if err = it.reader.GetFile().Close(); err == nil {
|
||||||
it.reader = 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) {
|
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 invalidFileHandle any
|
||||||
var autoClose bool
|
var autoClose bool
|
||||||
|
|
||||||
result = nil
|
|
||||||
|
|
||||||
if handle, invalidFileHandle, autoClose, err = initFileHandle(ctx, name, args); err == nil {
|
if handle, invalidFileHandle, autoClose, err = initFileHandle(ctx, name, args); err == nil {
|
||||||
if handle != nil {
|
if handle != nil {
|
||||||
result = newFileByteIterator(handle, autoClose)
|
result = newFileByteIterator(handle, autoClose)
|
||||||
|
|||||||
@@ -5,9 +5,6 @@
|
|||||||
package expr
|
package expr
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"slices"
|
|
||||||
|
|
||||||
"git.portale-stac.it/go-pkg/expr/file"
|
"git.portale-stac.it/go-pkg/expr/file"
|
||||||
"git.portale-stac.it/go-pkg/expr/kern"
|
"git.portale-stac.it/go-pkg/expr/kern"
|
||||||
)
|
)
|
||||||
@@ -15,15 +12,15 @@ import (
|
|||||||
const fileLineIteratorType = "fileLineIterator"
|
const fileLineIteratorType = "fileLineIterator"
|
||||||
|
|
||||||
type fileFileLineIterator struct {
|
type fileFileLineIterator struct {
|
||||||
reader *file.Reader
|
fileIterBase
|
||||||
index int64
|
line string
|
||||||
count int64
|
|
||||||
line string
|
|
||||||
autoClose bool
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func newFileLineIterator(r *file.Reader, autoClose bool) *fileFileLineIterator {
|
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 {
|
func (it *fileFileLineIterator) TypeName() string {
|
||||||
@@ -31,20 +28,12 @@ func (it *fileFileLineIterator) TypeName() string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (it *fileFileLineIterator) String() string {
|
func (it *fileFileLineIterator) String() string {
|
||||||
if it.reader != nil && it.reader.GetFile() != nil {
|
return it.repr(fileLineIteratorType)
|
||||||
return fmt.Sprintf("$(%s@%q)", fileLineIteratorType, it.reader.GetName())
|
|
||||||
}
|
|
||||||
return fmt.Sprintf("$(%s@<nil>)", fileLineIteratorType)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (it *fileFileLineIterator) Count() int64 {
|
|
||||||
return it.count
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (it *fileFileLineIterator) Next() (item any, err error) { // must return io.EOF after the last item
|
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 {
|
if it.line, err = it.reader.ReadString('\n'); err == nil {
|
||||||
it.index++
|
it.increment()
|
||||||
it.count++
|
|
||||||
item = it.line[0 : len(it.line)-1]
|
item = it.line[0 : len(it.line)-1]
|
||||||
} else if it.autoClose {
|
} else if it.autoClose {
|
||||||
it.Clean()
|
it.Clean()
|
||||||
@@ -59,30 +48,23 @@ func (it *fileFileLineIterator) Current() (item any, err error) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func (it *fileFileLineIterator) Index() int64 {
|
|
||||||
return it.index
|
|
||||||
}
|
|
||||||
|
|
||||||
func (it *fileFileLineIterator) Reset() (err error) {
|
func (it *fileFileLineIterator) Reset() (err error) {
|
||||||
if err = it.reader.Reset(); err == nil {
|
if err = it.reader.Reset(); err == nil {
|
||||||
it.index = -1
|
it.reset()
|
||||||
it.count = 0
|
|
||||||
it.line = ""
|
it.line = ""
|
||||||
}
|
}
|
||||||
return
|
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) {
|
func (it *fileFileLineIterator) Clean() (err error) {
|
||||||
if it.reader != nil {
|
if it.reader != nil {
|
||||||
if err = it.reader.Close(); err == nil {
|
if err = it.reader.Close(); err == nil {
|
||||||
it.reader = 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) {
|
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 invalidFileHandle any
|
||||||
var autoClose bool
|
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, invalidFileHandle, autoClose, err = initFileHandle(ctx, name, args); err == nil {
|
||||||
if handle != nil {
|
if handle != nil {
|
||||||
result = newFileLineIterator(handle, autoClose)
|
result = newFileLineIterator(handle, autoClose)
|
||||||
|
|||||||
@@ -5,12 +5,51 @@
|
|||||||
package expr
|
package expr
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
|
"slices"
|
||||||
|
|
||||||
"git.portale-stac.it/go-pkg/expr/file"
|
"git.portale-stac.it/go-pkg/expr/file"
|
||||||
"git.portale-stac.it/go-pkg/expr/kern"
|
"git.portale-stac.it/go-pkg/expr/kern"
|
||||||
)
|
)
|
||||||
|
|
||||||
const paramHandleOrPath = "handle-or-path"
|
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@<nil>)", fileLineIteratorType)
|
||||||
|
}
|
||||||
|
|
||||||
func initFileHandle(ctx kern.ExprContext, name string, args map[string]any) (handle *file.Reader, invalidFileHandle any, autoClose bool, err error) {
|
func initFileHandle(ctx kern.ExprContext, name string, args map[string]any) (handle *file.Reader, invalidFileHandle any, autoClose bool, err error) {
|
||||||
var ok bool
|
var ok bool
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user