github.com/zly-app/zapp@v1.3.3/pkg/serializer/base.go (about) 1 package serializer 2 3 import ( 4 "fmt" 5 "io" 6 "strconv" 7 ) 8 9 const BaseSerializerName = "base" 10 11 type baseSerializer struct { 12 marshal func(a interface{}) ([]byte, error) 13 unmarshal func(data []byte, a interface{}) error 14 } 15 16 func NewBaseSerializer( 17 marshal func(a interface{}) ([]byte, error), 18 unmarshal func(data []byte, a interface{}) error, 19 ) ISerializer { 20 return baseSerializer{marshal, unmarshal} 21 } 22 23 func (b baseSerializer) Marshal(a interface{}, w io.Writer) error { 24 s, err := b.toStr(a) 25 if err != nil { 26 return err 27 } 28 _, err = w.Write(StringToBytes(&s)) 29 return err 30 } 31 32 func (b baseSerializer) toBool(s string) (bool, error) { 33 switch s { 34 case "1", "t", "T", "true", "TRUE", "True", "y", "Y", "yes", "YES", "Yes", 35 "on", "ON", "On", "ok", "OK", "Ok", 36 "enabled", "ENABLED", "Enabled", 37 "open", "OPEN", "Open": 38 return true, nil 39 case "0", "f", "F", "false", "FALSE", "False", "n", "N", "no", "NO", "No", 40 "off", "OFF", "Off", "cancel", "CANCEL", "Cancel", 41 "disable", "DISABLE", "Disable", 42 "close", "CLOSE", "Close", 43 "", "nil", "Nil", "NIL", "null", "Null", "NULL", "none", "None", "NONE": 44 return false, nil 45 } 46 return false, fmt.Errorf(`数据"%s"无法转换为bool`, s) 47 } 48 func (b baseSerializer) toStr(a interface{}) (string, error) { 49 switch v := a.(type) { 50 51 case nil: 52 return "", nil 53 case string: 54 return v, nil 55 case []byte: 56 return *BytesToString(v), nil 57 case bool: 58 if v { 59 return "true", nil 60 } 61 return "false", nil 62 63 case int: 64 return strconv.FormatInt(int64(v), 10), nil 65 case int8: 66 return strconv.FormatInt(int64(v), 10), nil 67 case int16: 68 return strconv.FormatInt(int64(v), 10), nil 69 case int32: 70 return strconv.FormatInt(int64(v), 10), nil 71 case int64: 72 return strconv.FormatInt(v, 10), nil 73 74 case uint: 75 return strconv.FormatUint(uint64(v), 10), nil 76 case uint8: 77 return strconv.FormatUint(uint64(v), 10), nil 78 case uint16: 79 return strconv.FormatUint(uint64(v), 10), nil 80 case uint32: 81 return strconv.FormatUint(uint64(v), 10), nil 82 case uint64: 83 return strconv.FormatUint(v, 10), nil 84 } 85 86 switch v := a.(type) { 87 case *string: 88 return *v, nil 89 case *[]byte: 90 return *BytesToString(*v), nil 91 case *bool: 92 if *v { 93 return "true", nil 94 } 95 return "false", nil 96 97 case *int: 98 return strconv.FormatInt(int64(*v), 10), nil 99 case *int8: 100 return strconv.FormatInt(int64(*v), 10), nil 101 case *int16: 102 return strconv.FormatInt(int64(*v), 10), nil 103 case *int32: 104 return strconv.FormatInt(int64(*v), 10), nil 105 case *int64: 106 return strconv.FormatInt(*v, 10), nil 107 108 case *uint: 109 return strconv.FormatUint(uint64(*v), 10), nil 110 case *uint8: 111 return strconv.FormatUint(uint64(*v), 10), nil 112 case *uint16: 113 return strconv.FormatUint(uint64(*v), 10), nil 114 case *uint32: 115 return strconv.FormatUint(uint64(*v), 10), nil 116 case *uint64: 117 return strconv.FormatUint(*v, 10), nil 118 } 119 120 data, err := b.marshal(a) 121 if err != nil { 122 return "", err 123 } 124 return *BytesToString(data), nil 125 } 126 127 func (b baseSerializer) MarshalBytes(a interface{}) ([]byte, error) { 128 s, err := b.toStr(a) 129 if err != nil { 130 return nil, err 131 } 132 return StringToBytes(&s), nil 133 } 134 135 func (b baseSerializer) Unmarshal(r io.Reader, a interface{}) error { 136 bs, err := io.ReadAll(r) 137 if err != nil { 138 return err 139 } 140 return b.unmarshalBytes(bs, a) 141 } 142 143 func (b baseSerializer) UnmarshalBytes(data []byte, a interface{}) (err error) { 144 return b.unmarshalBytes(data, a) 145 } 146 func (b baseSerializer) unmarshalBytes(data []byte, a interface{}) (err error) { 147 s := *BytesToString(data) 148 switch p := a.(type) { 149 case nil: 150 return nil 151 case *string: 152 *p = s 153 case *[]byte: 154 *p = data 155 case *bool: 156 *p, err = b.toBool(s) 157 case *int: 158 *p, err = strconv.Atoi(s) 159 case *int8: 160 var n int64 161 n, err = strconv.ParseInt(s, 10, 8) 162 *p = int8(n) 163 case *int16: 164 var n int64 165 n, err = strconv.ParseInt(s, 10, 16) 166 *p = int16(n) 167 case *int32: 168 var n int64 169 n, err = strconv.ParseInt(s, 10, 32) 170 *p = int32(n) 171 case *int64: 172 *p, err = strconv.ParseInt(s, 10, 64) 173 174 case *uint: 175 var n uint64 176 n, err = strconv.ParseUint(s, 10, 64) 177 *p = uint(n) 178 case *uint8: 179 var n uint64 180 n, err = strconv.ParseUint(s, 10, 8) 181 *p = uint8(n) 182 case *uint16: 183 var n uint64 184 n, err = strconv.ParseUint(s, 10, 16) 185 *p = uint16(n) 186 case *uint32: 187 var n uint64 188 n, err = strconv.ParseUint(s, 10, 32) 189 *p = uint32(n) 190 case *uint64: 191 *p, err = strconv.ParseUint(s, 10, 64) 192 193 case *float32: 194 var n float64 195 n, err = strconv.ParseFloat(s, 32) 196 *p = float32(n) 197 case *float64: 198 *p, err = strconv.ParseFloat(s, 64) 199 200 default: 201 return b.unmarshal(data, a) 202 } 203 return 204 }