76 lines
1.5 KiB
Go
76 lines
1.5 KiB
Go
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)
|
|
}
|