SEBA-704 implement sorting

Change-Id: Ic790b01b36d6bad9f79e064bc04f77a22ddfd396
diff --git a/commands/command.go b/commands/command.go
index 4a38d5b..bdd7dfb 100644
--- a/commands/command.go
+++ b/commands/command.go
@@ -20,6 +20,7 @@
 	"encoding/json"
 	"fmt"
 	"github.com/opencord/cordctl/format"
+	"github.com/opencord/cordctl/order"
 	"google.golang.org/grpc"
 	"gopkg.in/yaml.v2"
 	"io"
@@ -95,6 +96,11 @@
 	OutputAs string `short:"o" long:"outputas" default:"table" choice:"table" choice:"json" choice:"yaml" description:"Type of output to generate"`
 }
 
+type ListOutputOptions struct {
+	OutputOptions
+	OrderBy string `short:"r" long:"orderby" default:"" description:"Specify the sort order of the results"`
+}
+
 func toOutputType(in string) OutputType {
 	switch in {
 	case "table":
@@ -110,6 +116,7 @@
 
 type CommandResult struct {
 	Format   format.Format
+	OrderBy  string
 	OutputAs OutputType
 	Data     interface{}
 }
@@ -191,17 +198,28 @@
 
 func GenerateOutput(result *CommandResult) {
 	if result != nil && result.Data != nil {
+		data := result.Data
+		if result.OrderBy != "" {
+			s, err := order.Parse(result.OrderBy)
+			if err != nil {
+				panic(err)
+			}
+			data, err = s.Process(data)
+			if err != nil {
+				panic(err)
+			}
+		}
 		if result.OutputAs == OUTPUT_TABLE {
 			tableFormat := format.Format(result.Format)
-			tableFormat.Execute(OutputStream, true, result.Data)
+			tableFormat.Execute(OutputStream, true, data)
 		} else if result.OutputAs == OUTPUT_JSON {
-			asJson, err := json.Marshal(&result.Data)
+			asJson, err := json.Marshal(&data)
 			if err != nil {
 				panic(err)
 			}
 			fmt.Fprintf(OutputStream, "%s", asJson)
 		} else if result.OutputAs == OUTPUT_YAML {
-			asYaml, err := yaml.Marshal(&result.Data)
+			asYaml, err := yaml.Marshal(&data)
 			if err != nil {
 				panic(err)
 			}
@@ -228,3 +246,23 @@
 
 	GenerateOutput(&result)
 }
+
+// Applies common output options to format and generate output
+func FormatAndGenerateListOutput(options *ListOutputOptions, default_format string, quiet_format string, data interface{}) {
+	outputFormat := CharReplacer.Replace(options.Format)
+	if outputFormat == "" {
+		outputFormat = default_format
+	}
+	if options.Quiet {
+		outputFormat = quiet_format
+	}
+
+	result := CommandResult{
+		Format:   format.Format(outputFormat),
+		OutputAs: toOutputType(options.OutputAs),
+		Data:     data,
+		OrderBy:  options.OrderBy,
+	}
+
+	GenerateOutput(&result)
+}