github.com/zlyuancn/zstr@v0.0.0-20230412074414-14d6b645962f/scan.go (about)

     1  /*
     2  -------------------------------------------------
     3     Author :       Zhang Fan
     4     date:         2020/1/11
     5     Description :
     6  -------------------------------------------------
     7  */
     8  
     9  package zstr
    10  
    11  import (
    12  	"encoding"
    13  	"fmt"
    14  	"strconv"
    15  )
    16  
    17  type AnyUnmarshaler interface {
    18  	UnmarshalAny(any interface{}) error
    19  }
    20  
    21  // 扫描字符串到任何, 输出变量不支持切片,数组,map,struct
    22  func Scan(s string, outPtr interface{}) (err error) {
    23  	switch p := outPtr.(type) {
    24  	case encoding.BinaryUnmarshaler:
    25  		return p.UnmarshalBinary(StringToBytes(&s))
    26  	}
    27  	switch p := outPtr.(type) {
    28  	case AnyUnmarshaler:
    29  		return p.UnmarshalAny(s)
    30  	}
    31  
    32  	switch p := outPtr.(type) {
    33  	case nil:
    34  		return fmt.Errorf("zstr.Scan(nil)")
    35  
    36  	case *string:
    37  		*p = s
    38  	case *[]byte:
    39  		*p = StringToBytes(&s)
    40  	case *bool:
    41  		*p, err = ToBool(s)
    42  	case *int:
    43  		*p, err = strconv.Atoi(s)
    44  	case *int8:
    45  		var n int64
    46  		n, err = strconv.ParseInt(s, 10, 8)
    47  		*p = int8(n)
    48  	case *int16:
    49  		var n int64
    50  		n, err = strconv.ParseInt(s, 10, 16)
    51  		*p = int16(n)
    52  	case *int32:
    53  		var n int64
    54  		n, err = strconv.ParseInt(s, 10, 32)
    55  		*p = int32(n)
    56  	case *int64:
    57  		*p, err = strconv.ParseInt(s, 10, 64)
    58  
    59  	case *uint:
    60  		var n uint64
    61  		n, err = strconv.ParseUint(s, 10, 64)
    62  		*p = uint(n)
    63  	case *uint8:
    64  		var n uint64
    65  		n, err = strconv.ParseUint(s, 10, 8)
    66  		*p = uint8(n)
    67  	case *uint16:
    68  		var n uint64
    69  		n, err = strconv.ParseUint(s, 10, 16)
    70  		*p = uint16(n)
    71  	case *uint32:
    72  		var n uint64
    73  		n, err = strconv.ParseUint(s, 10, 32)
    74  		*p = uint32(n)
    75  	case *uint64:
    76  		*p, err = strconv.ParseUint(s, 10, 64)
    77  
    78  	case *float32:
    79  		var n float64
    80  		n, err = strconv.ParseFloat(s, 32)
    81  		*p = float32(n)
    82  	case *float64:
    83  		*p, err = strconv.ParseFloat(s, 64)
    84  
    85  	default:
    86  		return fmt.Errorf("zstr.Scan(%T)无法解码, 考虑为它实现encoding.BinaryUnmarshaler接口或zstr.AnyUnmarshaler", p)
    87  	}
    88  	return
    89  }
    90  
    91  // 扫描任何值到任何, 输出变量不支持切片,数组,map,struct
    92  func ScanAny(any, outPtr interface{}) (err error) {
    93  	switch t := any.(type) {
    94  	case []byte:
    95  		return Scan(*BytesToString(t), outPtr)
    96  	case string:
    97  		return Scan(t, outPtr)
    98  	}
    99  
   100  	switch p := outPtr.(type) {
   101  	case AnyUnmarshaler:
   102  		return p.UnmarshalAny(any)
   103  	}
   104  
   105  	switch p := outPtr.(type) {
   106  	case nil:
   107  		return fmt.Errorf("zstr.Scan(nil)")
   108  
   109  	case *string:
   110  		*p = GetString(any)
   111  	case *[]byte:
   112  		s := GetString(any)
   113  		*p = StringToBytes(&s)
   114  	case *bool:
   115  		*p, err = ToBool(any)
   116  	case *int:
   117  		*p, err = ToInt(any)
   118  	case *int8:
   119  		*p, err = ToInt8(any)
   120  	case *int16:
   121  		*p, err = ToInt16(any)
   122  	case *int32:
   123  		*p, err = ToInt32(any)
   124  	case *int64:
   125  		*p, err = ToInt64(any)
   126  
   127  	case *uint:
   128  		*p, err = ToUint(any)
   129  	case *uint8:
   130  		*p, err = ToUint8(any)
   131  	case *uint16:
   132  		*p, err = ToUint16(any)
   133  	case *uint32:
   134  		*p, err = ToUint32(any)
   135  	case *uint64:
   136  		*p, err = ToUint64(any)
   137  
   138  	case *float32:
   139  		*p, err = ToFloat32(any)
   140  	case *float64:
   141  		*p, err = ToFloat64(any)
   142  
   143  	default:
   144  		return fmt.Errorf("zstr.Scan(%T)无法解码, 考虑为它实现zstr.AnyUnmarshaler接口", p)
   145  	}
   146  	return
   147  }