package registry import ( "fmt" "git.maximhutz.com/max/lambda/internal/cli" ) type Registry struct { marshalers map[string]cli.Marshaler codecs []cli.Codec engines map[string]cli.Engine } func New() *Registry { return &Registry{ marshalers: map[string]cli.Marshaler{}, codecs: []cli.Codec{}, engines: map[string]cli.Engine{}, } } func (r *Registry) AddCodec(c cli.Codec) error { r.codecs = append(r.codecs, c) return nil } func (r *Registry) AddMarshaler(c cli.Marshaler) error { if _, ok := r.marshalers[c.InType()]; ok { return fmt.Errorf("marshaler for '%s' already registered", c.InType()) } r.marshalers[c.InType()] = c return nil } func (r *Registry) AddEngine(e cli.Engine) error { if _, ok := r.engines[e.Name()]; ok { return fmt.Errorf("engine '%s' already registered", e.Name()) } r.engines[e.Name()] = e return nil } func (r *Registry) GetEngine(name string) (cli.Engine, error) { e, ok := r.engines[name] if !ok { return nil, fmt.Errorf("engine '%s' not found", name) } return e, nil } func (r *Registry) ConvertTo(repr cli.Repr, outType string) (cli.Repr, error) { panic("") } func (r *Registry) Marshal(repr cli.Repr) (string, error) { m, ok := r.marshalers[repr.Id()] if !ok { return "", fmt.Errorf("no marshaler for '%s'", repr.Id()) } return m.Encode(repr) } func (r *Registry) Unmarshal(s string, outType string) (cli.Repr, error) { m, ok := r.marshalers[outType] if !ok { return nil, fmt.Errorf("no marshaler for '%s'", outType) } return m.Decode(s) }