separate options

This commit is contained in:
2020-10-25 12:40:40 +03:00
parent 365fc32888
commit 1c7e9623ce
43 changed files with 510 additions and 493 deletions

View File

@@ -1,11 +1,11 @@
package value
import "gitoa.ru/go-4devs/console/input"
import "gitoa.ru/go-4devs/console/input/flag"
type Any struct {
Empty
Val []interface{}
Flag input.Flag
Flag flag.Flag
}
func (a *Any) Any() interface{} {

View File

@@ -3,13 +3,13 @@ package value
import (
"strconv"
"gitoa.ru/go-4devs/console/input"
"gitoa.ru/go-4devs/console/input/flag"
)
type Bool struct {
Empty
Val []bool
Flag input.Flag
Flag flag.Flag
}
func (b *Bool) Append(in string) error {
@@ -36,7 +36,7 @@ func (b *Bool) Bools() []bool {
}
func (b *Bool) Any() interface{} {
if b.Flag&input.ValueArray > 0 {
if b.Flag.IsArray() {
return b.Bools()
}

View File

@@ -3,13 +3,13 @@ package value
import (
"time"
"gitoa.ru/go-4devs/console/input"
"gitoa.ru/go-4devs/console/input/flag"
)
type Duration struct {
Empty
Val []time.Duration
Flag input.Flag
Flag flag.Flag
}
func (d *Duration) Append(in string) error {
@@ -36,7 +36,7 @@ func (d *Duration) Durations() []time.Duration {
}
func (d *Duration) Any() interface{} {
if d.Flag&input.ValueArray > 0 {
if d.Flag.IsArray() {
return d.Durations()
}

View File

@@ -1,16 +1,13 @@
package value
import (
"fmt"
"time"
"gitoa.ru/go-4devs/console/input"
)
type Empty struct{}
func (e *Empty) Append(string) error {
return fmt.Errorf("%w: in empty value", input.ErrInvalidName)
return ErrAppendEmpty
}
func (e *Empty) String() string {

View File

@@ -3,13 +3,13 @@ package value
import (
"strconv"
"gitoa.ru/go-4devs/console/input"
"gitoa.ru/go-4devs/console/input/flag"
)
type Float64 struct {
Empty
Val []float64
Flag input.Flag
Flag flag.Flag
}
func (f *Float64) Append(in string) error {
@@ -36,7 +36,7 @@ func (f *Float64) Float64s() []float64 {
}
func (f *Float64) Any() interface{} {
if f.Flag&input.ValueFloat64 > 0 {
if f.Flag.IsArray() {
return f.Float64s()
}

View File

@@ -3,13 +3,13 @@ package value
import (
"strconv"
"gitoa.ru/go-4devs/console/input"
"gitoa.ru/go-4devs/console/input/flag"
)
type Int struct {
Empty
Val []int
Flag input.Flag
Flag flag.Flag
}
func (i *Int) Append(in string) error {
@@ -36,7 +36,7 @@ func (i *Int) Ints() []int {
}
func (i *Int) Any() interface{} {
if i.Flag&input.ValueArray > 0 {
if i.Flag.IsArray() {
return i.Ints()
}

View File

@@ -3,13 +3,13 @@ package value
import (
"strconv"
"gitoa.ru/go-4devs/console/input"
"gitoa.ru/go-4devs/console/input/flag"
)
type Int64 struct {
Empty
Val []int64
Flag input.Flag
Flag flag.Flag
}
func (i *Int64) Int64() int64 {
@@ -25,7 +25,7 @@ func (i *Int64) Int64s() []int64 {
}
func (i *Int64) Any() interface{} {
if i.Flag&input.ValueArray > 0 {
if i.Flag.IsArray() {
return i.Int64s()
}

View File

@@ -1,17 +1,20 @@
package value
import (
"fmt"
"gitoa.ru/go-4devs/console/input"
"errors"
)
var _ input.AppendValue = (*Read)(nil)
var _ AppendValue = (*Read)(nil)
var (
ErrAppendRead = errors.New("invalid append data to read value")
ErrAppendEmpty = errors.New("invalid apped data to empty value")
)
type Read struct {
input.Value
Value
}
func (r *Read) Append(string) error {
return fmt.Errorf("%w: read value", input.ErrInvalidName)
return ErrAppendRead
}

View File

@@ -1,11 +1,11 @@
package value
import "gitoa.ru/go-4devs/console/input"
import "gitoa.ru/go-4devs/console/input/flag"
type String struct {
Empty
Val []string
Flag input.Flag
Flag flag.Flag
}
func (s *String) Append(in string) error {

View File

@@ -3,13 +3,13 @@ package value
import (
"time"
"gitoa.ru/go-4devs/console/input"
"gitoa.ru/go-4devs/console/input/flag"
)
type Time struct {
Empty
Val []time.Time
Flag input.Flag
Flag flag.Flag
}
func (t *Time) Append(in string) error {
@@ -36,7 +36,7 @@ func (t *Time) Times() []time.Time {
}
func (t *Time) Amy() interface{} {
if t.Flag&input.ValueArray > 0 {
if t.Flag.IsArray() {
return t.Times()
}

View File

@@ -3,13 +3,13 @@ package value
import (
"strconv"
"gitoa.ru/go-4devs/console/input"
"gitoa.ru/go-4devs/console/input/flag"
)
type Uint struct {
Empty
Val []uint
Flag input.Flag
Flag flag.Flag
}
func (u *Uint) Append(in string) error {
@@ -36,7 +36,7 @@ func (u *Uint) Uints() []uint {
}
func (u *Uint) Any() interface{} {
if u.Flag&input.ValueArray > 0 {
if u.Flag.IsArray() {
return u.Uints()
}

View File

@@ -3,13 +3,13 @@ package value
import (
"strconv"
"gitoa.ru/go-4devs/console/input"
"gitoa.ru/go-4devs/console/input/flag"
)
type Uint64 struct {
Empty
Val []uint64
Flag input.Flag
Flag flag.Flag
}
func (u *Uint64) Append(in string) error {
@@ -36,7 +36,7 @@ func (u *Uint64) Uint64s() []uint64 {
}
func (u *Uint64) Any() interface{} {
if u.Flag&input.ValueArray > 0 {
if u.Flag.IsArray() {
return u.Uint64s()
}

View File

@@ -3,81 +3,109 @@ package value
import (
"time"
"gitoa.ru/go-4devs/console/input"
"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 AppendValue interface {
Value
Append(string) error
}
//nolint: gocyclo
func New(v interface{}) input.Value {
func New(v interface{}) Value {
switch val := v.(type) {
case string:
return &String{Val: []string{val}, Flag: input.ValueString}
return &String{Val: []string{val}, Flag: flag.String}
case int:
return &Int{Val: []int{val}, Flag: input.ValueInt}
return &Int{Val: []int{val}, Flag: flag.Int}
case int64:
return &Int64{Val: []int64{val}, Flag: input.ValueInt64}
return &Int64{Val: []int64{val}, Flag: flag.Int64}
case uint:
return &Uint{Val: []uint{val}, Flag: input.ValueUint}
return &Uint{Val: []uint{val}, Flag: flag.Uint}
case uint64:
return &Uint64{Val: []uint64{val}, Flag: input.ValueUint64}
return &Uint64{Val: []uint64{val}, Flag: flag.Uint64}
case float64:
return &Float64{Val: []float64{val}, Flag: input.ValueFloat64}
return &Float64{Val: []float64{val}, Flag: flag.Float64}
case bool:
return &Bool{Val: []bool{val}, Flag: input.ValueBool}
return &Bool{Val: []bool{val}, Flag: flag.Bool}
case time.Duration:
return &Duration{Val: []time.Duration{val}, Flag: input.ValueDuration}
return &Duration{Val: []time.Duration{val}, Flag: flag.Duration}
case time.Time:
return &Time{Val: []time.Time{val}, Flag: input.ValueTime}
return &Time{Val: []time.Time{val}, Flag: flag.Time}
case []int64:
return &Int64{Val: val, Flag: input.ValueInt64 | input.ValueArray}
return &Int64{Val: val, Flag: flag.Int64 | flag.Array}
case []uint:
return &Uint{Val: val, Flag: input.ValueUint | input.ValueArray}
return &Uint{Val: val, Flag: flag.Uint | flag.Array}
case []uint64:
return &Uint64{Val: val, Flag: input.ValueUint64 | input.ValueArray}
return &Uint64{Val: val, Flag: flag.Uint64 | flag.Array}
case []float64:
return &Float64{Val: val, Flag: input.ValueFloat64 | input.ValueArray}
return &Float64{Val: val, Flag: flag.Float64 | flag.Array}
case []bool:
return &Bool{Val: val, Flag: input.ValueBool | input.ValueArray}
return &Bool{Val: val, Flag: flag.Bool | flag.Array}
case []time.Duration:
return &Duration{Val: val, Flag: input.ValueDuration | input.ValueArray}
return &Duration{Val: val, Flag: flag.Duration | flag.Array}
case []time.Time:
return &Time{Val: val, Flag: input.ValueTime | input.ValueArray}
return &Time{Val: val, Flag: flag.Time | flag.Array}
case []string:
return &String{Val: val, Flag: input.ValueString | input.ValueArray}
return &String{Val: val, Flag: flag.String | flag.Array}
case []int:
return &Int{Val: val, Flag: input.ValueInt | input.ValueArray}
return &Int{Val: val, Flag: flag.Int | flag.Array}
case []interface{}:
return &Any{Val: val, Flag: input.ValueAny | input.ValueArray}
case input.Value:
return &Any{Val: val, Flag: flag.Any | flag.Array}
case Value:
return val
default:
if v != nil {
return &Any{Val: []interface{}{v}, Flag: input.ValueAny}
return &Any{Val: []interface{}{v}, Flag: flag.Any}
}
return &Empty{}
}
}
func ByFlag(flag input.Flag) input.AppendValue {
func ByFlag(f flag.Flag) AppendValue {
switch {
case flag.IsInt():
return &Int{Flag: flag | input.ValueInt}
case flag.IsInt64():
return &Int64{Flag: flag | input.ValueInt64}
case flag.IsUint():
return &Uint{Flag: flag | input.ValueUint}
case flag.IsUint64():
return &Uint64{Flag: flag | input.ValueUint64}
case flag.IsFloat64():
return &Float64{Flag: flag | input.ValueFloat64}
case flag.IsBool():
return &Bool{Flag: flag | input.ValueBool}
case flag.IsDuration():
return &Duration{Flag: flag | input.ValueDuration}
case flag.IsTime():
return &Time{Flag: flag | input.ValueTime}
case flag.IsAny():
return &Any{Flag: flag | input.ValueAny}
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{}
}