48 lines
780 B
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
|
|
}
|