66 lines
1.3 KiB
Go
66 lines
1.3 KiB
Go
package dal
|
|
|
|
import (
|
|
"context"
|
|
"encoding/json"
|
|
"github.com/cortezaproject/corteza-server/pkg/filter"
|
|
"io"
|
|
)
|
|
|
|
type (
|
|
// Iterator provides an interface for loading data from the underlying store
|
|
Iterator interface {
|
|
Next(ctx context.Context) bool
|
|
More(uint, ValueGetter) error
|
|
Err() error
|
|
Scan(ValueSetter) error
|
|
Close() error
|
|
|
|
BackCursor(ValueGetter) (*filter.PagingCursor, error)
|
|
ForwardCursor(ValueGetter) (*filter.PagingCursor, error)
|
|
|
|
// // -1 means unknown
|
|
// Total() int
|
|
// Cursor() any
|
|
// // ... do we need anything else here?
|
|
}
|
|
)
|
|
|
|
// IteratorEncodeJSON helper function that encodes each item from the iterator as JSON
|
|
// and writes it to th given io.Writer.
|
|
//
|
|
// target initialization function is intentionally used to avoid use of reflection
|
|
func IteratorEncodeJSON(ctx context.Context, w io.Writer, iter Iterator, initTarget func() ValueSetter) (err error) {
|
|
var (
|
|
target ValueSetter
|
|
firstOut = false
|
|
)
|
|
|
|
for iter.Next(ctx) {
|
|
if err = iter.Err(); err != nil {
|
|
return
|
|
}
|
|
|
|
if firstOut {
|
|
if _, err = w.Write([]byte(`,`)); err != nil {
|
|
return
|
|
}
|
|
}
|
|
|
|
firstOut = true
|
|
|
|
target = initTarget()
|
|
|
|
if err = iter.Scan(target); err != nil {
|
|
return
|
|
}
|
|
|
|
err = json.NewEncoder(w).Encode(target)
|
|
if err != nil {
|
|
return
|
|
}
|
|
}
|
|
|
|
return
|
|
}
|