Hermes/pkg/config/parser.go

48 lines
780 B
Go

package config
import (
"os"
"github.com/go-playground/validator/v10"
"gopkg.in/yaml.v3"
)
type Parser[T interface{}] interface {
ParseFile(path string) (T, error)
}
func NewParser[T interface{}]() Parser[T] {
validate := validator.New(validator.WithRequiredStructEnabled())
return &parser[T]{
validate: validate,
}
}
type parser[T interface{}] struct {
validate *validator.Validate
}
func (p *parser[T]) ParseFile(path string) (T, error) {
fileBytes, err := os.ReadFile(path)
if err != nil {
var t T
return t, err
}
return p.parse(fileBytes)
}
func (p *parser[T]) parse(b []byte) (T, error) {
var t T
if err := yaml.Unmarshal(b, &t); err != nil {
return t, err
}
if err := p.validate.Struct(t); err != nil {
return t, err
}
return t, nil
}