Files
console/input/array.go
andrey 4fdeb73e8a
All checks were successful
continuous-integration/drone/push Build is passing
continuous-integration/drone/tag Build is passing
add value vithh error (#1)
Co-authored-by: andrey1s <andrey@4devs.pro>
Reviewed-on: #1
Co-authored-by: andrey <andrey@4devs.io>
Co-committed-by: andrey <andrey@4devs.io>
2022-09-18 21:37:25 +03:00

111 lines
2.0 KiB
Go

package input
import (
"context"
"gitoa.ru/go-4devs/console/input/argument"
"gitoa.ru/go-4devs/console/input/errs"
"gitoa.ru/go-4devs/console/input/option"
"gitoa.ru/go-4devs/console/input/value"
)
type Array struct {
Map
defaults Map
}
func (a *Array) Option(ctx context.Context, name string) value.Value {
if v := a.Map.Option(ctx, name); !value.IsEmpty(v) {
return v
}
if v := a.defaults.Option(ctx, name); !value.IsEmpty(v) {
return v
}
return value.Empty()
}
func (a *Array) Argument(ctx context.Context, name string) value.Value {
if v := a.Map.Argument(ctx, name); !value.IsEmpty(v) {
return v
}
if v := a.defaults.Argument(ctx, name); !value.IsEmpty(v) {
return v
}
return value.Empty()
}
func (a *Array) Bind(ctx context.Context, d *Definition) error {
if err := a.bindArguments(ctx, d); err != nil {
return err
}
return a.bindOption(ctx, d)
}
func (a *Array) bindOption(ctx context.Context, def *Definition) error {
for _, name := range def.Options() {
opt, err := def.Option(name)
if err != nil {
return err
}
if !a.HasOption(name) {
switch {
case opt.HasDefault():
a.defaults.SetOption(name, opt.Default)
continue
case opt.IsRequired():
return option.Err(name, errs.ErrRequired)
default:
continue
}
}
v := a.Map.Option(ctx, name)
if value.IsEmpty(v) {
continue
}
if err := opt.Validate(v); err != nil {
return option.Err(name, err)
}
}
return nil
}
func (a *Array) bindArguments(ctx context.Context, def *Definition) error {
for pos, name := range def.Arguments() {
arg, err := def.Argument(pos)
if err != nil {
return err
}
if !a.HasArgument(name) {
switch {
case arg.HasDefault():
a.defaults.SetArgument(name, arg.Default)
continue
case arg.IsRequired():
return argument.Err(name, errs.ErrRequired)
default:
continue
}
}
if v := a.Map.Argument(ctx, name); !value.IsEmpty(v) {
if err := arg.Validate(v); err != nil {
return argument.Err(name, err)
}
}
}
return nil
}