LastMUD/internal/command/registry.go
Miroslav Vasilev 681f153881 Move Commands
2025-06-27 14:58:52 +03:00

62 lines
1.3 KiB
Go

package command
import (
"code.haedhutner.dev/mvv/LastMUD/internal/logging"
)
type TokenMatcher func(tokens []Token) bool
type ParameterParser func(tokens []Token) []Parameter
type CommandWork func(parameters ...Parameter) (err error)
type CommandDefinition struct {
name string
tokenMatcher TokenMatcher
parameterParser ParameterParser
}
func CreateCommandDefinition(
name string,
tokenMatcher TokenMatcher,
parameterParser ParameterParser,
) CommandDefinition {
return CommandDefinition{
name: name,
tokenMatcher: tokenMatcher,
parameterParser: parameterParser,
}
}
func (def CommandDefinition) Name() string {
return def.name
}
func (def CommandDefinition) Match(tokens []Token) bool {
return def.tokenMatcher(tokens)
}
func (def CommandDefinition) ParseParameters(tokens []Token) []Parameter {
return def.parameterParser(tokens)
}
type CommandRegistry struct {
commandDefinitions []CommandDefinition
}
func CreateCommandRegistry(commandDefinitions ...CommandDefinition) *CommandRegistry {
return &CommandRegistry{
commandDefinitions: commandDefinitions,
}
}
func (comReg *CommandRegistry) Match(tokens []Token) (comDef *CommandDefinition) {
for _, v := range comReg.commandDefinitions {
if v.Match(tokens) {
logging.Debug("Found match ", v.Name())
return &v
}
}
return
}