diff --git a/wrapper.go b/wrapper.go new file mode 100644 index 0000000..8663b71 --- /dev/null +++ b/wrapper.go @@ -0,0 +1,76 @@ +// Package serialize ... +// +// Description : serialize ... +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 2025-04-28 11:58 +package serialize + +import ( + "errors" + "git.zhangdeman.cn/zhangdeman/serialize/abstract" + "sync" +) + +var ( + Wrapper = &wrapper{ + serializableTable: map[string]abstract.Serializable{ + "xml": Xml, + "yml": Yml, + "yaml": Yml, + "toml": Toml, + "ini": Ini, + "json": JSON, + }, + l: &sync.RWMutex{}, + } +) + +type wrapper struct { + serializableTable map[string]abstract.Serializable + l *sync.RWMutex +} + +// GetSerializable ... +func (w *wrapper) GetSerializable(t string) (abstract.Serializable, error) { + w.l.RLock() + if _, exist := w.serializableTable[t]; !exist { + w.l.RUnlock() + return nil, errors.New(t + ": is not support") + } + serializable := w.serializableTable[t] + w.l.RUnlock() + if nil == serializable { + return nil, errors.New("serializable is nil") + } + return serializable, nil +} + +// SetSerializable 设置序列化实现, 已存在会覆盖 +func (w *wrapper) SetSerializable(t string, serializable abstract.Serializable) { + if nil == serializable { + return + } + w.l.Lock() + defer w.l.Unlock() + w.serializableTable[t] = serializable +} + +// Marshal 序列化 +func (w *wrapper) Marshal(marshalType string, input any) ([]byte, error) { + serializable, err := w.GetSerializable(marshalType) + if nil != err { + return nil, err + } + return serializable.MarshalForByte(input) +} + +// Unmarshal 反序列化 +func (w *wrapper) Unmarshal(unmarshalType string, input []byte, receiver any) error { + serializable, err := w.GetSerializable(unmarshalType) + if nil != err { + return err + } + return serializable.UnmarshalWithNumber(input, receiver) +} diff --git a/yml.go b/yml.go index c4e170f..a1de86a 100644 --- a/yml.go +++ b/yml.go @@ -14,7 +14,7 @@ import ( ) var ( - Yml = ownYml{} + Yml = &ownYml{} ) type ownYml struct{}