package gen import ( "fmt" "reflect" "sort" "github.com/spf13/cast" ) func min(a, b int) int { if a < b { return a } return b } func sortDedupStrings(in []string) []string { sort.Strings(in) j := 0 for i := 1; i < len(in); i++ { if in[j] == in[i] { continue } j++ in[j] = in[i] } return in[:j+1] } // ToInt64SliceE casts an interface to a []int64 type. func toInt64SliceE(i interface{}) ([]int64, error) { if i == nil { return []int64{}, fmt.Errorf("unable to cast %#v of type %T to []int64", i, i) } switch v := i.(type) { case []int64: return v, nil } kind := reflect.TypeOf(i).Kind() switch kind { case reflect.Slice, reflect.Array: s := reflect.ValueOf(i) a := make([]int64, s.Len()) for j := 0; j < s.Len(); j++ { val, err := cast.ToInt64E(s.Index(j).Interface()) if err != nil { return []int64{}, fmt.Errorf("unable to cast %#v of type %T to []int64", i, i) } a[j] = val } return a, nil default: return []int64{}, fmt.Errorf("unable to cast %#v of type %T to []int64", i, i) } } // ToFloat64SliceE casts an interface to a []float64 type. func toFloat64SliceE(i interface{}) ([]float64, error) { if i == nil { return []float64{}, fmt.Errorf("unable to cast %#v of type %T to []float64", i, i) } switch v := i.(type) { case []float64: return v, nil } kind := reflect.TypeOf(i).Kind() switch kind { case reflect.Slice, reflect.Array: s := reflect.ValueOf(i) a := make([]float64, s.Len()) for j := 0; j < s.Len(); j++ { val, err := cast.ToFloat64E(s.Index(j).Interface()) if err != nil { return []float64{}, fmt.Errorf("unable to cast %#v of type %T to []float64", i, i) } a[j] = val } return a, nil default: return []float64{}, fmt.Errorf("unable to cast %#v of type %T to []float64", i, i) } }