package adapters import ( "fmt" "iop/apps/node/internal/runtime" ) // Registry holds all registered adapters by name. type Registry struct { adapters map[string]runtime.Adapter order []string // insertion order — first registered is the default } func NewRegistry() *Registry { return &Registry{adapters: make(map[string]runtime.Adapter)} } // Register adds an adapter. The first registered adapter becomes the default. func (r *Registry) Register(a runtime.Adapter) { name := a.Name() if _, exists := r.adapters[name]; !exists { r.order = append(r.order, name) } r.adapters[name] = a } func (r *Registry) Get(name string) (runtime.Adapter, bool) { a, ok := r.adapters[name] return a, ok } func (r *Registry) Default() string { if len(r.order) == 0 { return "" } return r.order[0] } // All returns all registered adapters in registration order. func (r *Registry) All() []runtime.Adapter { out := make([]runtime.Adapter, 0, len(r.order)) for _, name := range r.order { out = append(out, r.adapters[name]) } return out } // MustGet returns the adapter or panics — useful during bootstrap validation. func (r *Registry) MustGet(name string) runtime.Adapter { a, ok := r.Get(name) if !ok { panic(fmt.Sprintf("adapter %q not registered", name)) } return a }