iop/apps/node/internal/adapters/registry.go
toki 2d6fde0876 기능: IOP 모노레포 스캐폴드 초기 구현
apps/node 중심 구현 — TCP+JSON transport, Hexagonal Architecture,
mock/cli adapter, fx DI, SQLite 실행 이력 저장.
edge/control-plane/worker는 cobra placeholder.
유닛 테스트 및 통합 테스트 클라이언트 계획서 추가.
2026-05-02 13:20:35 +09:00

56 lines
1.3 KiB
Go

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
}