goserver_sync/core/cmdline/cmdline.go

122 lines
2.4 KiB
Go

package cmdline
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"time"
"mongo.games.com/goserver/core/module"
)
var cmdpool = make(map[string]cmdExecuter)
type cmdGoroutineWapper struct {
}
type CmdArg struct {
Flag string
SimplifyFlag string
Required bool
}
type CmdArgParser struct {
cmeKV map[string]string
}
type cmdExecuter interface {
Execute(args []string)
ShowUsage()
}
func NewCmdArgParser(args []string) *CmdArgParser {
parser := &CmdArgParser{
cmeKV: make(map[string]string),
}
for _, arg := range args {
kv := strings.Split(arg, "=")
if len(kv) == 2 {
k := kv[0]
v := kv[1]
parser.cmeKV[k] = v
}
}
return parser
}
func RegisteCmd(cmdName string, executer cmdExecuter) {
cmdpool[strings.ToLower(cmdName)] = executer
}
func (cw *cmdGoroutineWapper) Start() {
if Config.SupportCmdLine {
go func() {
var (
reader = bufio.NewReader(os.Stdin)
cmdLine []byte
isPrefix bool
err error
)
for {
cmdLine, isPrefix, err = reader.ReadLine()
if err == nil && isPrefix == false {
params := strings.Split(string(cmdLine), " ")
if len(params) >= 1 {
cmdName := strings.ToLower(params[0])
if cmdExecute, exist := cmdpool[cmdName]; exist {
PostCmd(module.AppModule.Object, cmdExecute, params[1:])
}
}
}
time.Sleep(time.Second)
}
}()
}
}
func (this *CmdArgParser) ExtraIntArg(arg *CmdArg, val *int) {
if v, exist := this.cmeKV[arg.SimplifyFlag]; !exist {
if v, exist := this.cmeKV[arg.Flag]; !exist && arg.Required {
fmt.Println(arg.Flag, "must be give")
return
} else {
*val, _ = strconv.Atoi(v)
}
} else {
*val, _ = strconv.Atoi(v)
}
}
func (this *CmdArgParser) ExtraInt64Arg(arg *CmdArg, val *int64) {
if v, exist := this.cmeKV[arg.SimplifyFlag]; !exist {
if v, exist := this.cmeKV[arg.Flag]; !exist && arg.Required {
fmt.Println(arg.Flag, "must be give")
return
} else {
*val, _ = strconv.ParseInt(v, 10, 64)
}
} else {
*val, _ = strconv.ParseInt(v, 10, 64)
}
}
func (this *CmdArgParser) ExtraStringArg(arg *CmdArg, val *string) {
if v, exist := this.cmeKV[arg.SimplifyFlag]; !exist {
if v, exist := this.cmeKV[arg.Flag]; !exist && arg.Required {
fmt.Println(arg.Flag, "must be give")
return
} else {
*val = v
}
} else {
*val = v
}
}
func init() {
//module.RegistePreloadModule(&cmdGoroutineWapper{}, 0)
}