feat(binana): add tokens database
Some checks failed
Push / build (push) Has been cancelled

This commit is contained in:
phaneron 2026-03-20 01:58:16 -04:00
parent ac268a16c8
commit 2c2815ab0b
22 changed files with 2122 additions and 2 deletions

View file

@ -0,0 +1,80 @@
package dbutil
import (
"encoding/json"
"fmt"
"io"
"os"
"github.com/parquet-go/parquet-go"
)
type Writer[T any] struct {
write func([]T) (err error)
close func() (err error)
}
func (writer *Writer[T]) WriteEntries(entries []T) (err error) {
err = writer.write(entries)
return
}
func (writer *Writer[T]) Close() (err error) {
err = writer.close()
return
}
func Open[T any](name string, format DatabaseFormat) (writer *Writer[T], err error) {
writer = new(Writer[T])
var (
file *os.File
output io.Writer
)
if name == "" {
output = os.Stdout
} else {
file, err = os.Create(name)
if err != nil {
return
}
output = file
}
switch format {
case DatabaseJSON:
encoder := json.NewEncoder(output)
writer.write = func(entries []T) (err error) {
for _, entry := range entries {
if err = encoder.Encode(&entry); err != nil {
return
}
}
return
}
writer.close = func() (err error) {
if file != nil {
err = file.Close()
}
return
}
case DatabaseParquet:
generic_writer := parquet.NewGenericWriter[T](output)
writer.write = func(entries []T) (err error) {
_, err = generic_writer.Write(entries)
return
}
writer.close = func() (err error) {
if err = generic_writer.Close(); err != nil {
return
}
if file != nil {
err = file.Close()
}
return
}
default:
err = fmt.Errorf("%w: %d", ErrUnknownDatabaseFormat, format)
}
return
}