first commit
This commit is contained in:
105
input/wrap/input.go
Normal file
105
input/wrap/input.go
Normal file
@@ -0,0 +1,105 @@
|
||||
package wrap
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
|
||||
"gitoa.ru/go-4devs/console/input"
|
||||
"gitoa.ru/go-4devs/console/input/value"
|
||||
)
|
||||
|
||||
type Input struct {
|
||||
input.ReadInput
|
||||
}
|
||||
|
||||
func (i *Input) Option(ctx context.Context, name string) input.Value {
|
||||
if v, err := i.ReadOption(ctx, name); err == nil {
|
||||
return v
|
||||
}
|
||||
|
||||
return &value.Empty{}
|
||||
}
|
||||
|
||||
func (i *Input) Argument(ctx context.Context, name string) input.Value {
|
||||
if v, err := i.ReadArgument(ctx, name); err == nil {
|
||||
return v
|
||||
}
|
||||
|
||||
return &value.Empty{}
|
||||
}
|
||||
|
||||
func (i *Input) Bind(ctx context.Context, def *input.Definition) error {
|
||||
if err := i.ReadInput.Bind(ctx, def); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := i.bindArguments(ctx, def); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return i.bindOptions(ctx, def)
|
||||
}
|
||||
|
||||
func (i *Input) bindOptions(ctx context.Context, def *input.Definition) error {
|
||||
for _, name := range def.Options() {
|
||||
opt, err := def.Option(name)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
v, err := i.ReadOption(ctx, name)
|
||||
if err != nil && !errors.Is(err, input.ErrNotFound) {
|
||||
return input.ErrorOption(name, err)
|
||||
}
|
||||
|
||||
if err == nil {
|
||||
if err := opt.Validate(v); err != nil {
|
||||
return input.ErrorOption(name, err)
|
||||
}
|
||||
|
||||
continue
|
||||
}
|
||||
|
||||
if opt.IsRequired() && !opt.HasDefault() {
|
||||
return input.ErrorOption(name, input.ErrRequired)
|
||||
}
|
||||
|
||||
if opt.HasDefault() {
|
||||
i.SetOption(name, opt.Default)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (i *Input) bindArguments(ctx context.Context, def *input.Definition) error {
|
||||
for pos, name := range def.Arguments() {
|
||||
arg, err := def.Argument(pos)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
v, err := i.ReadArgument(ctx, name)
|
||||
if err != nil && !errors.Is(err, input.ErrNotFound) {
|
||||
return input.ErrorArgument(name, err)
|
||||
}
|
||||
|
||||
if err == nil {
|
||||
if err := arg.Validate(v); err != nil {
|
||||
return input.ErrorArgument(name, err)
|
||||
}
|
||||
|
||||
continue
|
||||
}
|
||||
|
||||
if arg.IsRequired() && !arg.HasDefault() {
|
||||
return input.ErrorArgument(name, input.ErrRequired)
|
||||
}
|
||||
|
||||
if arg.HasDefault() {
|
||||
i.SetArgument(name, arg.Default)
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
Reference in New Issue
Block a user