github.com/willmadison/cli@v6.40.1-0.20181018160101-29d5937903ff+incompatible/types/null_int.go (about) 1 package types 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "strconv" 7 ) 8 9 // NullInt is a wrapper around integer values that can be null or an integer. 10 // Use IsSet to check if the value is provided, instead of checking against 0. 11 type NullInt struct { 12 IsSet bool 13 Value int 14 } 15 16 // ParseStringValue is used to parse a user provided flag argument. 17 func (n *NullInt) ParseStringValue(val string) error { 18 if val == "" { 19 return nil 20 } 21 22 intVal, err := strconv.Atoi(val) 23 if err != nil { 24 return err 25 } 26 27 n.Value = intVal 28 n.IsSet = true 29 30 return nil 31 } 32 33 // ParseIntValue is used to parse a user provided *int argument. 34 func (n *NullInt) ParseIntValue(val *int) { 35 if val == nil { 36 n.IsSet = false 37 n.Value = 0 38 return 39 } 40 41 n.Value = *val 42 n.IsSet = true 43 } 44 45 func (n *NullInt) UnmarshalFlag(val string) error { 46 return n.ParseStringValue(val) 47 } 48 49 func (n *NullInt) UnmarshalJSON(rawJSON []byte) error { 50 var value json.Number 51 err := json.Unmarshal(rawJSON, &value) 52 if err != nil { 53 return err 54 } 55 56 if value.String() == "" { 57 n.Value = 0 58 n.IsSet = false 59 return nil 60 } 61 62 valueInt, err := strconv.Atoi(value.String()) 63 if err != nil { 64 return err 65 } 66 67 n.Value = valueInt 68 n.IsSet = true 69 70 return nil 71 } 72 73 func (n NullInt) MarshalJSON() ([]byte, error) { 74 if n.IsSet { 75 return []byte(fmt.Sprint(n.Value)), nil 76 } 77 return []byte("null"), nil 78 }