// Copyright 2024 Matthew Rich . All rights reserved. package codec import ( "encoding/json" _ "fmt" _ "github.com/xeipuuv/gojsonschema" "gopkg.in/yaml.v3" "io" "log/slog" "strings" "google.golang.org/protobuf/proto" ) //type JSONDecoder json.Decoder type Decoder interface { Decode(v any) error } func NewDecoder(r io.Reader, format Format) Decoder { switch format { case FormatYaml: return NewYAMLDecoder(r) case FormatJson: return NewJSONDecoder(r) case FormatProtoBuf: return NewProtoBufDecoder(r) } return nil } func NewStringDecoder(s string, format Format) Decoder { return NewDecoder(strings.NewReader(s), format) } func NewJSONDecoder(r io.Reader) Decoder { return json.NewDecoder(r) } func NewJSONStringDecoder(s string) Decoder { return json.NewDecoder(strings.NewReader(s)) } func NewYAMLDecoder(r io.Reader) Decoder { slog.Info("NewYAMLDecoder()", "reader", r) return yaml.NewDecoder(r) } func NewYAMLStringDecoder(s string) Decoder { return yaml.NewDecoder(strings.NewReader(s)) } type ProtoDecoder struct { reader io.Reader } func (p *ProtoDecoder) Decode(v any) (err error) { var protoData []byte protoData, err = io.ReadAll(p.reader) if err == nil { err = proto.Unmarshal(protoData, v.(proto.Message)) } return } func NewProtoBufDecoder(r io.Reader) Decoder { return &ProtoDecoder{ reader: r } }