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 }