You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

90 lines
1.8 KiB
Go

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

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 := &registry{
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
}