github.com/aaronlehmann/figtree@v1.0.1/convert.go (about)

     1  package figtree
     2  
     3  import (
     4  	"fmt"
     5  	"strconv"
     6  )
     7  
     8  // dst must be a pointer type
     9  func convertString(src string, dst interface{}) (err error) {
    10  	switch v := dst.(type) {
    11  	case *bool:
    12  		*v, err = strconv.ParseBool(src)
    13  	case *string:
    14  		*v = src
    15  	case *int:
    16  		var tmp int64
    17  		// this is a cheat, we only know int is at least 32 bits
    18  		// but we have to make a compromise here
    19  		tmp, err = strconv.ParseInt(src, 10, 32)
    20  		*v = int(tmp)
    21  	case *int8:
    22  		var tmp int64
    23  		tmp, err = strconv.ParseInt(src, 10, 8)
    24  		*v = int8(tmp)
    25  	case *int16:
    26  		var tmp int64
    27  		tmp, err = strconv.ParseInt(src, 10, 16)
    28  		*v = int16(tmp)
    29  	case *int32:
    30  		var tmp int64
    31  		tmp, err = strconv.ParseInt(src, 10, 32)
    32  		*v = int32(tmp)
    33  	case *int64:
    34  		var tmp int64
    35  		tmp, err = strconv.ParseInt(src, 10, 64)
    36  		*v = int64(tmp)
    37  	case *uint:
    38  		var tmp uint64
    39  		// this is a cheat, we only know uint is at least 32 bits
    40  		// but we have to make a compromise here
    41  		tmp, err = strconv.ParseUint(src, 10, 32)
    42  		*v = uint(tmp)
    43  	case *uint8:
    44  		var tmp uint64
    45  		tmp, err = strconv.ParseUint(src, 10, 8)
    46  		*v = uint8(tmp)
    47  	case *uint16:
    48  		var tmp uint64
    49  		tmp, err = strconv.ParseUint(src, 10, 16)
    50  		*v = uint16(tmp)
    51  	case *uint32:
    52  		var tmp uint64
    53  		tmp, err = strconv.ParseUint(src, 10, 32)
    54  		*v = uint32(tmp)
    55  	case *uint64:
    56  		var tmp uint64
    57  		tmp, err = strconv.ParseUint(src, 10, 64)
    58  		*v = uint64(tmp)
    59  	// hmm, collides with uint8
    60  	// case *byte:
    61  	// 	tmp := []byte(src)
    62  	// 	if len(tmp) == 1 {
    63  	// 		*v = tmp[0]
    64  	// 	} else {
    65  	// 		err = fmt.Errorf("Cannot convert string %q to byte, length: %d", src, len(tmp))
    66  	// 	}
    67  	// hmm, collides with int32
    68  	// case *rune:
    69  	// 	tmp := []rune(src)
    70  	// 	if len(tmp) == 1 {
    71  	// 		*v = tmp[0]
    72  	// 	} else {
    73  	// 		err = fmt.Errorf("Cannot convert string %q to rune, lengt: %d", src, len(tmp))
    74  	// 	}
    75  	case *float32:
    76  		var tmp float64
    77  		tmp, err = strconv.ParseFloat(src, 32)
    78  		*v = float32(tmp)
    79  	case *float64:
    80  		var tmp float64
    81  		tmp, err = strconv.ParseFloat(src, 64)
    82  		*v = float64(tmp)
    83  	default:
    84  		err = fmt.Errorf("Cannot convert string %q to type %T", src, dst)
    85  	}
    86  	if err != nil {
    87  		return err
    88  	}
    89  
    90  	return nil
    91  }