azkustodata/value/int.go (62 lines of code) (raw):
package value
import (
"encoding/json"
"fmt"
"github.com/Azure/azure-kusto-go/azkustodata/types"
"math"
"reflect"
)
// Int represents a Kusto boolean type. Bool implements Kusto.
type Int struct {
pointerValue[int32]
}
func NewInt(v int32) *Int {
return &Int{newPointerValue[int32](&v)}
}
func NewNullInt() *Int {
return &Int{newPointerValue[int32](nil)}
}
// Convert Int into reflect value.
func (in *Int) Convert(v reflect.Value) error {
if TryConvert[int32](*in, &in.pointerValue, v) {
return nil
}
if v.Type().Kind() == reflect.Int {
if in.value != nil {
v.SetInt(int64(*in.value))
}
return nil
}
return convertError(in, v)
}
// GetType returns the type of the value.
func (in *Int) GetType() types.Column {
return types.Int
}
func (in *Int) Unmarshal(i interface{}) error {
if i == nil {
in.value = nil
return nil
}
var myInt int64
switch v := i.(type) {
case json.Number:
var err error
myInt, err = v.Int64()
if err != nil {
return parseError(in, i, err)
}
case float64:
if v != math.Trunc(v) {
return parseError(in, i, fmt.Errorf("float64 value was not an integer"))
}
myInt = int64(v)
case int:
myInt = int64(v)
default:
return convertError(in, i)
}
if myInt > math.MaxInt32 {
return parseError(in, i, fmt.Errorf("value was too large for int32"))
}
val := int32(myInt)
in.value = &val
return nil
}