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