package registry import ( "fmt" "git.maximhutz.com/max/lambda/pkg/engine" ) type Engine interface { Load(Repr) (Process, error) Name() string InType() string } type convertedEngine[T any] struct { engine engine.Engine[T] name string inType string } func (e convertedEngine[T]) InType() string { return e.inType } func (e convertedEngine[T]) Name() string { return e.name } func (e convertedEngine[T]) Load(r Repr) (Process, error) { t, ok := r.Data().(T) if !ok { return nil, fmt.Errorf("'ncorrent format '%s' for engine '%s'", r.ID(), e.inType) } process, err := e.engine(t) if err != nil { return nil, err } return convertedProcess[T]{process, e.inType}, nil } func RegisterEngine[T any](registry *Registry, e engine.Engine[T], name, inType string) error { if _, ok := registry.engines[name]; ok { return fmt.Errorf("engine '%s' already registered", name) } registry.engines[name] = &convertedEngine[T]{e, name, inType} return nil }