Select Git revision
assets.go 3.75 KiB
package perxis
import (
"io"
"io/fs"
"path/filepath"
"git.perx.ru/perxis/perxis-go/pkg/errors"
"git.perx.ru/perxis/perxis-go/yaml"
jsoniter "github.com/json-iterator/go"
)
// Assets предоставляет методы для загрузки данных из файловой системы
type Assets[T any] struct {
FS fs.FS
Constructor func() T
}
// NewAssets возвращает новый экземпляр загрузчика
func NewAssets[T any](fsys fs.FS) *Assets[T] {
return &Assets[T]{
FS: fsys,
Constructor: func() (t T) { return t }, // По умолчанию zero-value
}
}
// WithConstructor устанавливает конструктор для создания новых экземпляров
func (a *Assets[T]) WithConstructor(t func() T) *Assets[T] {
a.Constructor = t
return a
}
// MustFrom возвращает все записи из переданного файла или директории
func (a *Assets[T]) MustFrom(path string) []T {
res, err := a.From(path)
if err != nil {
panic(err)
}
return res
}
// MustOneFrom возвращает одну запись из переданного файла или директории
func (a *Assets[T]) MustOneFrom(path string) T {
res, err := a.From(path)
if err != nil {
panic(err)
}
if len(res) == 0 {
panic(errors.Errorf("no entries found"))
}
if len(res) > 1 {
panic(errors.Errorf("multiple entries found"))
}
return res[0]
}
// From возвращает записи из переданного файла или директории
func (a *Assets[T]) From(path string) ([]T, error) {
f, err := a.FS.Open(path)
if err != nil {
return nil, err
}
defer f.Close()
stat, err := f.Stat()
if err != nil {
return nil, err
}