|
|
|
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
|
|
|
|
}
|