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  }