diff --git a/console/add_account.go b/console/add_account.go index 86f7cb9f3..a11800e5e 100644 --- a/console/add_account.go +++ b/console/add_account.go @@ -18,48 +18,28 @@ along with this program. If not, see package console -import ( - "encoding/json" - "fmt" - "reflect" - - "github.com/cgrates/cgrates/apier" -) +import "github.com/cgrates/cgrates/apier" func init() { - commands["add_account"] = &CmdAddAccount{ + c := &CmdAddAccount{ + name: "add_account", rpcMethod: "ApierV1.SetAccount", } + commands[c.Name()] = c + c.CommandExecuter = &CommandExecuter{c} } // Commander implementation type CmdAddAccount struct { + name string rpcMethod string rpcParams *apier.AttrSetAccount rpcResult string + *CommandExecuter } -func (self *CmdAddAccount) Usage() string { - jsn, _ := json.Marshal(apier.AttrSetAccount{Direction: "*out"}) - return "\n\tUsage: add_account " + FromJSON(jsn, self.ClientArgs()) + "\n" -} - -// Parses command line args and builds CmdBalance value -func (self *CmdAddAccount) FromArgs(args string, verbose bool) error { - if len(args) == 0 { - return fmt.Errorf(self.Usage()) - } - // defaults - self.rpcParams = &apier.AttrSetAccount{Direction: "*out"} - - if err := json.Unmarshal(ToJSON(args), &self.rpcParams); err != nil { - return err - } - if verbose { - jsn, _ := json.Marshal(self.rpcParams) - fmt.Println("add_account ", FromJSON(jsn, self.ClientArgs())) - } - return nil +func (self *CmdAddAccount) Name() string { + return self.name } func (self *CmdAddAccount) RpcMethod() string { @@ -73,13 +53,3 @@ func (self *CmdAddAccount) RpcParams() interface{} { func (self *CmdAddAccount) RpcResult() interface{} { return &self.rpcResult } - -func (self *CmdAddAccount) ClientArgs() (args []string) { - val := reflect.ValueOf(&apier.AttrSetAccount{}).Elem() - - for i := 0; i < val.NumField(); i++ { - typeField := val.Type().Field(i) - args = append(args, typeField.Name) - } - return -} diff --git a/console/add_balance.go b/console/add_balance.go index 7309c7280..ffd01aeeb 100644 --- a/console/add_balance.go +++ b/console/add_balance.go @@ -19,49 +19,31 @@ along with this program. If not, see package console import ( - "encoding/json" - "fmt" - "reflect" - "github.com/cgrates/cgrates/apier" "github.com/cgrates/cgrates/engine" ) func init() { - commands["add_balance"] = &CmdAddBalance{ + c := &CmdAddBalance{ + name: "add_balance", rpcMethod: "ApierV1.AddBalance", rpcParams: &apier.AttrAddBalance{BalanceType: engine.CREDIT}, } + commands[c.Name()] = c + c.CommandExecuter = &CommandExecuter{c} } // Commander implementation type CmdAddBalance struct { + name string rpcMethod string rpcParams *apier.AttrAddBalance rpcResult string + *CommandExecuter } -func (self *CmdAddBalance) Usage() string { - jsn, _ := json.Marshal(apier.AttrAddBalance{Direction: "*out"}) - return "\n\tUsage: add_balance " + FromJSON(jsn, self.ClientArgs()) + "\n" -} - -// Parses command line args and builds CmdBalance value -func (self *CmdAddBalance) FromArgs(args string, verbose bool) error { - if len(args) == 0 { - return fmt.Errorf(self.Usage()) - } - // defaults - self.rpcParams = &apier.AttrAddBalance{Direction: "*out"} - - if err := json.Unmarshal(ToJSON(args), &self.rpcParams); err != nil { - return err - } - if verbose { - jsn, _ := json.Marshal(self.rpcParams) - fmt.Println("add_balance ", FromJSON(jsn, self.ClientArgs())) - } - return nil +func (self *CmdAddBalance) Name() string { + return self.name } func (self *CmdAddBalance) RpcMethod() string { @@ -75,13 +57,3 @@ func (self *CmdAddBalance) RpcParams() interface{} { func (self *CmdAddBalance) RpcResult() interface{} { return &self.rpcResult } - -func (self *CmdAddBalance) ClientArgs() (args []string) { - val := reflect.ValueOf(&apier.AttrAddBalance{}).Elem() - - for i := 0; i < val.NumField(); i++ { - typeField := val.Type().Field(i) - args = append(args, typeField.Name) - } - return -} diff --git a/console/command.go b/console/command.go index e9346fafd..fb2647ea9 100644 --- a/console/command.go +++ b/console/command.go @@ -5,6 +5,7 @@ Copyright (C) 2013 ITsysCOM This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -41,6 +42,7 @@ type Commander interface { RpcParams() interface{} // Parameters to send out on rpc RpcResult() interface{} // Only requirement is to have a String method to print on console ClientArgs() []string // for autocompletion + Name() string } func GetCommands() map[string]Commander { diff --git a/console/command_executer.go b/console/command_executer.go new file mode 100644 index 000000000..81271c3af --- /dev/null +++ b/console/command_executer.go @@ -0,0 +1,63 @@ +/* +Rating system designed to be used in VoIP Carriers World +Copyright (C) 2013 ITsysCOM + +This program is free software: you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation, either version 3 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program. If not, see +*/ + +package console + +import ( + "encoding/json" + "fmt" + "reflect" + + "github.com/cgrates/cgrates/apier" +) + +// Commander implementation +type CommandExecuter struct { + command Commander +} + +func (ce *CommandExecuter) Usage() string { + jsn, _ := json.Marshal(ce.command.RpcParams()) + return fmt.Sprintf("\n\tUsage: %s %s \n", ce.command.Name(), FromJSON(jsn, ce.command.ClientArgs())) +} + +// Parses command line args and builds CmdBalance value +func (ce *CommandExecuter) FromArgs(args string, verbose bool) error { + if len(args) == 0 { + return fmt.Errorf(ce.Usage()) + } + + if err := json.Unmarshal(ToJSON(args), ce.command.RpcParams()); err != nil { + return err + } + if verbose { + jsn, _ := json.Marshal(ce.command.RpcParams()) + fmt.Println(ce.command.Name(), FromJSON(jsn, ce.command.ClientArgs())) + } + return nil +} + +func (ce *CommandExecuter) ClientArgs() (args []string) { + val := reflect.ValueOf(&apier.AttrAddBalance{}).Elem() + + for i := 0; i < val.NumField(); i++ { + typeField := val.Type().Field(i) + args = append(args, typeField.Name) + } + return +} diff --git a/console/get_cost.go b/console/get_cost.go index 7dce5465a..2702ef1e5 100644 --- a/console/get_cost.go +++ b/console/get_cost.go @@ -18,49 +18,30 @@ along with this program. If not, see package console -import ( - "encoding/json" - "fmt" - - "github.com/cgrates/cgrates/engine" -) +import "github.com/cgrates/cgrates/engine" func init() { - commands["get_cost"] = &CmdGetCost{ + c := &CmdGetCost{ + name: "get_cost", rpcMethod: "Responder.GetCost", clientArgs: []string{"Direction", "TOR", "Tenant", "Subject", "Account", "Destination", "TimeStart", "TimeEnd", "CallDuration", "FallbackSubject"}, } + commands[c.Name()] = c + c.CommandExecuter = &CommandExecuter{c} } // Commander implementation type CmdGetCost struct { + name string rpcMethod string rpcParams *engine.CallDescriptor rpcResult engine.CallCost clientArgs []string + *CommandExecuter } -func (self *CmdGetCost) Usage() string { - jsn, _ := json.Marshal(engine.CallDescriptor{Direction: "*out"}) - return "\n\tUsage: get_cost " + FromJSON(jsn, self.clientArgs) + "\n" -} - -// Parses command line args and builds CmdBalance value -func (self *CmdGetCost) FromArgs(args string, verbose bool) error { - if len(args) == 0 { - return fmt.Errorf(self.Usage()) - } - // defaults - self.rpcParams = &engine.CallDescriptor{Direction: "*out"} - - if err := json.Unmarshal(ToJSON(args), &self.rpcParams); err != nil { - return err - } - if verbose { - jsn, _ := json.Marshal(self.rpcParams) - fmt.Println("get_cost ", FromJSON(jsn, self.clientArgs)) - } - return nil +func (self *CmdGetCost) Name() string { + return self.name } func (self *CmdGetCost) RpcMethod() string { @@ -68,6 +49,9 @@ func (self *CmdGetCost) RpcMethod() string { } func (self *CmdGetCost) RpcParams() interface{} { + if self.rpcParams == nil { + self.rpcParams = &engine.CallDescriptor{Direction: "*out"} + } return self.rpcParams } diff --git a/console/status.go b/console/status.go index cf3ccab97..47af4197d 100644 --- a/console/status.go +++ b/console/status.go @@ -19,22 +19,24 @@ along with this program. If not, see package console func init() { - commands["status"] = &CmdStatus{rpcMethod: "Responder.Status"} + c := &CmdStatus{ + name: "status", + rpcMethod: "Responder.Status", + } + commands[c.Name()] = c + c.CommandExecuter = &CommandExecuter{c} } type CmdStatus struct { + name string rpcMethod string rpcParams string rpcResult string + *CommandExecuter } -func (self *CmdStatus) Usage() string { - return "\n\tUsage: status \n" -} - -// Parses command line args and builds CmdBalance value -func (self *CmdStatus) FromArgs(args string, verbose bool) error { - return nil +func (self *CmdStatus) Name() string { + return self.name } func (self *CmdStatus) RpcMethod() string {