56 lines
1.1 KiB
Go
56 lines
1.1 KiB
Go
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}
|
|
}
|