package cli import ( "fmt" "git.maximhutz.com/max/lambda/pkg/codec" ) type Codec interface { codec.Codec[Repr, Repr] InType() string OutType() string } type convertedCodec[T, U any] struct { codec codec.Codec[T, U] inType, outType string } func (c convertedCodec[T, U]) Decode(r Repr) (Repr, error) { u, ok := r.Data().(U) if !ok { return nil, fmt.Errorf("could not parse '%v' as '%s'", r, c.inType) } t, err := c.codec.Decode(u) if err != nil { return nil, err } return NewRepr(c.outType, t), nil } func (c convertedCodec[T, U]) Encode(r Repr) (Repr, error) { t, ok := r.Data().(T) if !ok { return nil, fmt.Errorf("could not parse '%v' as '%s'", t, c.outType) } u, err := c.codec.Encode(t) if err != nil { return nil, err } return NewRepr(c.inType, u), nil } func (c convertedCodec[T, U]) InType() string { return c.inType } func (c convertedCodec[T, U]) OutType() string { return c.outType } func ConvertCodec[T, U any](e codec.Codec[T, U], inType, outType string) Codec { return convertedCodec[T, U]{e, inType, outType} }