|
|
|
package value
|
|
|
|
|
|
|
|
import (
|
|
|
|
"time"
|
|
|
|
)
|
|
|
|
|
|
|
|
type Value interface {
|
|
|
|
ReadValue
|
|
|
|
ParseValue
|
|
|
|
ArrValue
|
|
|
|
}
|
|
|
|
|
|
|
|
type UnmarshalValue interface {
|
|
|
|
Unmarshal(val interface{}) error
|
|
|
|
}
|
|
|
|
|
|
|
|
type ReadValue interface {
|
|
|
|
String() string
|
|
|
|
Int() int
|
|
|
|
Int64() int64
|
|
|
|
Uint() uint
|
|
|
|
Uint64() uint64
|
|
|
|
Float64() float64
|
|
|
|
Bool() bool
|
|
|
|
Duration() time.Duration
|
|
|
|
Time() time.Time
|
|
|
|
}
|
|
|
|
|
|
|
|
type AnyValue interface {
|
|
|
|
Any() interface{}
|
|
|
|
}
|
|
|
|
|
|
|
|
type SliceValue interface {
|
|
|
|
AnyValue
|
|
|
|
UnmarshalValue
|
|
|
|
ArrValue
|
|
|
|
}
|
|
|
|
|
|
|
|
type ArrValue interface {
|
|
|
|
Strings() []string
|
|
|
|
Ints() []int
|
|
|
|
Int64s() []int64
|
|
|
|
Uints() []uint
|
|
|
|
Uint64s() []uint64
|
|
|
|
Float64s() []float64
|
|
|
|
Bools() []bool
|
|
|
|
Durations() []time.Duration
|
|
|
|
Times() []time.Time
|
|
|
|
}
|
|
|
|
|
|
|
|
//nolint:interfacebloat
|
|
|
|
type ParseValue interface {
|
|
|
|
ParseString() (string, error)
|
|
|
|
ParseInt() (int, error)
|
|
|
|
ParseInt64() (int64, error)
|
|
|
|
ParseUint() (uint, error)
|
|
|
|
ParseUint64() (uint64, error)
|
|
|
|
ParseFloat64() (float64, error)
|
|
|
|
ParseBool() (bool, error)
|
|
|
|
ParseDuration() (time.Duration, error)
|
|
|
|
ParseTime() (time.Time, error)
|
|
|
|
UnmarshalValue
|
|
|
|
AnyValue
|
|
|
|
}
|
|
|
|
|
|
|
|
type Append interface {
|
|
|
|
Value
|
|
|
|
Append(string) (Value, error)
|
|
|
|
}
|
|
|
|
|
|
|
|
//nolint:gocyclo,cyclop
|
|
|
|
func New(in interface{}) Value {
|
|
|
|
switch val := in.(type) {
|
|
|
|
case bool:
|
|
|
|
return Read{Bool(val)}
|
|
|
|
case []bool:
|
|
|
|
return NewBools(val)
|
|
|
|
case string:
|
|
|
|
return Read{String(val)}
|
|
|
|
case int:
|
|
|
|
return Read{Int(val)}
|
|
|
|
case int64:
|
|
|
|
return Read{Int64(val)}
|
|
|
|
case uint:
|
|
|
|
return Read{Uint(val)}
|
|
|
|
case uint64:
|
|
|
|
return Read{Uint64(val)}
|
|
|
|
case float64:
|
|
|
|
return Read{Float64(val)}
|
|
|
|
case time.Duration:
|
|
|
|
return Read{Duration(val)}
|
|
|
|
case time.Time:
|
|
|
|
return Read{Time{val}}
|
|
|
|
case []int64:
|
|
|
|
return Slice{Int64s(val)}
|
|
|
|
case []uint:
|
|
|
|
return Slice{Uints(val)}
|
|
|
|
case []uint64:
|
|
|
|
return Slice{Uint64s(val)}
|
|
|
|
case []float64:
|
|
|
|
return Slice{Float64s(val)}
|
|
|
|
case []time.Duration:
|
|
|
|
return Slice{Durations(val)}
|
|
|
|
case []time.Time:
|
|
|
|
return Slice{Times(val)}
|
|
|
|
case []string:
|
|
|
|
return Slice{Strings(val)}
|
|
|
|
case []int:
|
|
|
|
return Slice{Ints(val)}
|
|
|
|
case []interface{}:
|
|
|
|
return Read{Any{v: val}}
|
|
|
|
case Value:
|
|
|
|
return val
|
|
|
|
default:
|
|
|
|
if in != nil {
|
|
|
|
return Read{Any{v: in}}
|
|
|
|
}
|
|
|
|
|
|
|
|
return Empty()
|
|
|
|
}
|
|
|
|
}
|