first commit
This commit is contained in:
89
descriptor/descriptor.go
Normal file
89
descriptor/descriptor.go
Normal file
@@ -0,0 +1,89 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user