package codec import ( "fmt" codecpkg "github.com/noahlann/nnet/pkg/codec" ) // PlainCodec 直接透传的编解码器 // Encode:支持 []byte、string、fmt.Stringer 和 nil // Decode:支持 *([]byte) 和 *string type PlainCodec struct{} // NewPlainCodec 创建新的 Plain 编解码器 func NewPlainCodec() codecpkg.Codec { return &PlainCodec{} } // Name 获取编解码器名称 func (c *PlainCodec) Name() string { return "plain" } // Encode 将数据编码为字节 func (c *PlainCodec) Encode(v interface{}) ([]byte, error) { if v == nil { return nil, nil } switch value := v.(type) { case []byte: return value, nil case string: return []byte(value), nil case fmt.Stringer: return []byte(value.String()), nil default: return nil, codecpkg.NewErrorf("plain codec only supports []byte, string or fmt.Stringer, got %T", v) } } // Decode 将字节解码为目标类型 func (c *PlainCodec) Decode(data []byte, v interface{}) error { if v == nil { return codecpkg.NewError("decode target cannot be nil") } switch target := v.(type) { case *[]byte: if data == nil { *target = nil } else { *target = append((*target)[:0], data...) } return nil case *string: if data == nil { *target = "" } else { *target = string(data) } return nil default: return codecpkg.NewErrorf("plain codec only supports *[]byte or *string, got %T", v) } }