You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

90 lines
1.6 KiB

4 years ago
package descriptor
import (
"context"
"errors"
"sync"
"gitoa.ru/go-4devs/console/input"
"gitoa.ru/go-4devs/console/output"
)
var ErrDescriptorNotFound = errors.New("descriptor not found")
//nolint: gochecknoglobals
var (
descriptors = map[string]Descriptor{
"txt": &txt{},
}
descriptorMu sync.Mutex
)
type Command struct {
Bin string
Name string
Description string
Help string
Definition *input.Definition
}
type Commands struct {
Namespace string
Definition *input.Definition
Commands []NSCommand
}
type NSCommand struct {
Name string
Commands []ShortCommand
}
func (n *NSCommand) Append(name, desc string) {
n.Commands = append(n.Commands, ShortCommand{Name: name, Description: desc})
}
type ShortCommand struct {
Name string
Description string
}
type Descriptor interface {
Command(ctx context.Context, out output.Output, cmd Command) error
Commands(ctx context.Context, out output.Output, cmds Commands) error
}
func Find(name string) (Descriptor, error) {
descriptorMu.Lock()
defer descriptorMu.Unlock()
if d, has := descriptors[name]; has {
return d, nil
}
return nil, ErrDescriptorNotFound
}
func Descriptors() []string {
names := make([]string, 0, len(descriptors))
for name := range descriptors {
names = append(names, name)
}
return names
}
func Register(name string, descriptor Descriptor) {
descriptorMu.Lock()
defer descriptorMu.Unlock()
if descriptor == nil {
panic("console: Register descriptor is nil")
}
if _, has := descriptors[name]; has {
panic("console: Register called twice for descriptor " + name)
}
descriptors[name] = descriptor
}