mirror of
https://github.com/astaxie/beego.git
synced 2024-11-25 15:50:54 +00:00
88 lines
2.2 KiB
Go
88 lines
2.2 KiB
Go
|
// Copyright 2020
|
||
|
//
|
||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
// you may not use this file except in compliance with the License.
|
||
|
// You may obtain a copy of the License at
|
||
|
//
|
||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||
|
//
|
||
|
// Unless required by applicable law or agreed to in writing, software
|
||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
// See the License for the specific language governing permissions and
|
||
|
// limitations under the License.
|
||
|
|
||
|
package governor
|
||
|
|
||
|
import (
|
||
|
"github.com/pkg/errors"
|
||
|
)
|
||
|
|
||
|
// Command is an experimental interface
|
||
|
// We try to use this to decouple modules
|
||
|
// All other modules depends on this, and they register the command they support
|
||
|
// We may change the API in the future, so be careful about this.
|
||
|
type Command interface {
|
||
|
Execute(params ...interface{}) *Result
|
||
|
}
|
||
|
|
||
|
var CommandNotFound = errors.New("Command not found")
|
||
|
|
||
|
type Result struct {
|
||
|
// Status is the same as http.Status
|
||
|
Status int
|
||
|
Error error
|
||
|
Content interface{}
|
||
|
}
|
||
|
|
||
|
func (r *Result) IsSuccess() bool {
|
||
|
return r.Status >= 200 && r.Status < 300
|
||
|
}
|
||
|
|
||
|
// CommandRegistry stores all commands
|
||
|
// name => command
|
||
|
type moduleCommands map[string]Command
|
||
|
|
||
|
// Get returns command with the name
|
||
|
func (m moduleCommands) Get(name string) Command {
|
||
|
c, ok := m[name]
|
||
|
if ok {
|
||
|
return c
|
||
|
}
|
||
|
return &doNothingCommand{}
|
||
|
}
|
||
|
|
||
|
// module name => moduleCommand
|
||
|
type commandRegistry map[string]moduleCommands
|
||
|
|
||
|
// Get returns module's commands
|
||
|
func (c commandRegistry) Get(moduleName string) moduleCommands {
|
||
|
if mcs, ok := c[moduleName]; ok {
|
||
|
return mcs
|
||
|
}
|
||
|
res := make(moduleCommands)
|
||
|
c[moduleName] = res
|
||
|
return res
|
||
|
}
|
||
|
|
||
|
var cmdRegistry = make(commandRegistry)
|
||
|
|
||
|
// RegisterCommand is not thread-safe
|
||
|
// do not use it in concurrent case
|
||
|
func RegisterCommand(module string, commandName string, command Command) {
|
||
|
cmdRegistry.Get(module)[commandName] = command
|
||
|
}
|
||
|
|
||
|
func GetCommand(module string, cmdName string) Command {
|
||
|
return cmdRegistry.Get(module).Get(cmdName)
|
||
|
}
|
||
|
|
||
|
type doNothingCommand struct{}
|
||
|
|
||
|
func (d *doNothingCommand) Execute(params ...interface{}) *Result {
|
||
|
return &Result{
|
||
|
Status: 404,
|
||
|
Error: CommandNotFound,
|
||
|
}
|
||
|
}
|