88 lines
1.7 KiB
Go
88 lines
1.7 KiB
Go
// Copyright 2024 Matthew Rich <matthewrich.conf@gmail.com>. All rights reserved.
|
|
|
|
package codec
|
|
|
|
import (
|
|
"io"
|
|
"fmt"
|
|
"errors"
|
|
"encoding/json"
|
|
"gopkg.in/yaml.v3"
|
|
)
|
|
|
|
const (
|
|
FormatYml Format = "yml"
|
|
FormatYaml Format = "yaml"
|
|
FormatJson Format = "json"
|
|
FormatProtoBuf Format = "protobuf"
|
|
)
|
|
|
|
var ErrInvalidFormat error = errors.New("invalid Format value")
|
|
|
|
type Format string
|
|
|
|
func (f *Format) Validate() error {
|
|
switch *f {
|
|
case FormatYml, FormatYaml, FormatJson, FormatProtoBuf:
|
|
return nil
|
|
default:
|
|
return fmt.Errorf("%w: %s", ErrInvalidFormat, *f)
|
|
}
|
|
}
|
|
|
|
func (f *Format) Set(value string) (err error) {
|
|
if err = (*Format)(&value).Validate(); err == nil {
|
|
err = f.UnmarshalValue(value)
|
|
}
|
|
return
|
|
}
|
|
|
|
func (f *Format) UnmarshalValue(value string) error {
|
|
switch value {
|
|
case string(FormatYml):
|
|
*f = FormatYaml
|
|
case string(FormatYaml), string(FormatJson), string(FormatProtoBuf):
|
|
*f = Format(value)
|
|
default:
|
|
return ErrInvalidFormat
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (f *Format) UnmarshalJSON(data []byte) error {
|
|
var s string
|
|
if unmarshalFormatTypeErr := json.Unmarshal(data, &s); unmarshalFormatTypeErr != nil {
|
|
return unmarshalFormatTypeErr
|
|
}
|
|
return f.UnmarshalValue(s)
|
|
}
|
|
|
|
func (f *Format) UnmarshalYAML(value *yaml.Node) error {
|
|
var s string
|
|
if err := value.Decode(&s); err != nil {
|
|
return err
|
|
}
|
|
return f.UnmarshalValue(s)
|
|
}
|
|
|
|
func (f Format) Encoder(w io.Writer) Encoder {
|
|
return NewEncoder(w, f)
|
|
}
|
|
|
|
func (f Format) Decoder(r io.Reader) Decoder {
|
|
return NewDecoder(r, f)
|
|
}
|
|
|
|
func (f Format) StringDecoder(s string) Decoder {
|
|
return NewStringDecoder(s, f)
|
|
}
|
|
|
|
func (f Format) Serialize(object any, w io.Writer) error {
|
|
return f.Encoder(w).Encode(object)
|
|
}
|
|
|
|
func (f Format) Deserialize(r io.Reader, object any) error {
|
|
return f.Decoder(r).Decode(object)
|
|
}
|
|
|