apps/node 중심 구현 — TCP+JSON transport, Hexagonal Architecture, mock/cli adapter, fx DI, SQLite 실행 이력 저장. edge/control-plane/worker는 cobra placeholder. 유닛 테스트 및 통합 테스트 클라이언트 계획서 추가.
56 lines
1.3 KiB
Go
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
|
|
}
|