package value import ( "time" "gitoa.ru/go-4devs/console/input/flag" ) type Value interface { String() string Int() int Int64() int64 Uint() uint Uint64() uint64 Float64() float64 Bool() bool Duration() time.Duration Time() time.Time Any() interface{} Strings() []string Ints() []int Int64s() []int64 Uints() []uint Uint64s() []uint64 Float64s() []float64 Bools() []bool Durations() []time.Duration Times() []time.Time } type Append interface { Value Append(string) error } //nolint: gocyclo func New(v interface{}) Append { switch val := v.(type) { case string: return &String{Val: []string{val}, Flag: flag.String} case int: return &Int{Val: []int{val}, Flag: flag.Int} case int64: return &Int64{Val: []int64{val}, Flag: flag.Int64} case uint: return &Uint{Val: []uint{val}, Flag: flag.Uint} case uint64: return &Uint64{Val: []uint64{val}, Flag: flag.Uint64} case float64: return &Float64{Val: []float64{val}, Flag: flag.Float64} case bool: return &Bool{Val: []bool{val}, Flag: flag.Bool} case time.Duration: return &Duration{Val: []time.Duration{val}, Flag: flag.Duration} case time.Time: return &Time{Val: []time.Time{val}, Flag: flag.Time} case []int64: return &Int64{Val: val, Flag: flag.Int64 | flag.Array} case []uint: return &Uint{Val: val, Flag: flag.Uint | flag.Array} case []uint64: return &Uint64{Val: val, Flag: flag.Uint64 | flag.Array} case []float64: return &Float64{Val: val, Flag: flag.Float64 | flag.Array} case []bool: return &Bool{Val: val, Flag: flag.Bool | flag.Array} case []time.Duration: return &Duration{Val: val, Flag: flag.Duration | flag.Array} case []time.Time: return &Time{Val: val, Flag: flag.Time | flag.Array} case []string: return &String{Val: val, Flag: flag.String | flag.Array} case []int: return &Int{Val: val, Flag: flag.Int | flag.Array} case []interface{}: return &Any{Val: val, Flag: flag.Any | flag.Array} case Append: return val case Value: return &Read{Value: val} default: if v != nil { return &Any{Val: []interface{}{v}, Flag: flag.Any} } return &empty{} } } func ByFlag(f flag.Flag) Append { switch { case f.IsInt(): return &Int{Flag: f | flag.Int} case f.IsInt64(): return &Int64{Flag: f | flag.Int64} case f.IsUint(): return &Uint{Flag: f | flag.Uint} case f.IsUint64(): return &Uint64{Flag: f | flag.Uint64} case f.IsFloat64(): return &Float64{Flag: f | flag.Float64} case f.IsBool(): return &Bool{Flag: f | flag.Bool} case f.IsDuration(): return &Duration{Flag: f | flag.Duration} case f.IsTime(): return &Time{Flag: f | flag.Time} case f.IsAny(): return &Any{Flag: f | flag.Any} default: return &String{} } }