package codec import ( "fmt" "sync" codecpkg "github.com/noahlann/nnet/pkg/codec" ) // registry 编解码器注册表实现 type registry struct { codecs map[string]codecpkg.Codec defaultCodec codecpkg.Codec mu sync.RWMutex } // NewRegistry 创建编解码器注册表 // 注意:不再预定义任何codec,所有codec通过resolver动态注册 func NewRegistry() codecpkg.Registry { r := ®istry{ codecs: make(map[string]codecpkg.Codec), } // 注册二进制编解码器作为默认(如果没有其他codec,至少有一个可用的) binaryCodec := NewBinaryCodec() r.defaultCodec = binaryCodec r.codecs["binary"] = binaryCodec // 注册常用编解码器 r.codecs["json"] = NewJSONCodec() r.codecs["plain"] = NewPlainCodec() return r } // Register 注册编解码器 func (r *registry) Register(name string, c codecpkg.Codec) error { r.mu.Lock() defer r.mu.Unlock() if name == "" { return codecpkg.NewError("codec name cannot be empty") } if c == nil { return codecpkg.NewError("codec cannot be nil") } r.codecs[name] = c return nil } // Get 获取编解码器 func (r *registry) Get(name string) (codecpkg.Codec, error) { r.mu.RLock() defer r.mu.RUnlock() if name == "" { return r.defaultCodec, nil } c, ok := r.codecs[name] if !ok { return nil, codecpkg.NewError(fmt.Sprintf("codec %s not found", name)) } return c, nil } // Default 获取默认编解码器 func (r *registry) Default() codecpkg.Codec { r.mu.RLock() defer r.mu.RUnlock() return r.defaultCodec } // SetDefault 设置默认编解码器(内部方法) func (r *registry) SetDefault(name string) error { r.mu.Lock() defer r.mu.Unlock() c, ok := r.codecs[name] if !ok { return codecpkg.NewError(fmt.Sprintf("codec %s not found", name)) } r.defaultCodec = c return nil }