From 2bdcdcb1dd9873a375170d2925e26c4e4cb795ff Mon Sep 17 00:00:00 2001 From: Sacha Ligthert Date: Tue, 28 Jan 2025 19:50:42 +0100 Subject: [PATCH] Add JSON render + small refactoring (Closes #25) --- export/Export.go | 6 ++-- .../{renderFlatSolutions.go => renderFlat.go} | 4 +-- ...bleSolutions.go => renderHumanReadable.go} | 4 +-- export/renderJSON.go | 36 +++++++++++++++++++ flags/ParseFlags.go | 4 +-- 5 files changed, 46 insertions(+), 8 deletions(-) rename export/{renderFlatSolutions.go => renderFlat.go} (64%) rename export/{renderHumanReadableSolutions.go => renderHumanReadable.go} (80%) create mode 100644 export/renderJSON.go diff --git a/export/Export.go b/export/Export.go index 66a0603..212ddcc 100644 --- a/export/Export.go +++ b/export/Export.go @@ -4,9 +4,11 @@ func (export *Export) Export() (render string) { // Print the valid solutions switch export.Controller.Output { case "human": - render = export.RenderHumanReadableSolutions() + render = export.renderHumanReadable() case "flat": - render = export.renderFlatSolutions() + render = export.renderFlat() + case "json": + render = export.renderJSON() } return } diff --git a/export/renderFlatSolutions.go b/export/renderFlat.go similarity index 64% rename from export/renderFlatSolutions.go rename to export/renderFlat.go index f93a4e3..a3621d9 100644 --- a/export/renderFlatSolutions.go +++ b/export/renderFlat.go @@ -5,8 +5,8 @@ import ( "strconv" ) -// Print solutions into a human friendly format for in the console. -func (export *Export) renderFlatSolutions() (render string) { +// Render output as stored internally. +func (export *Export) renderFlat() (render string) { for solutionIndex, solution := range export.Controller.Solutions { render += fmt.Sprintln("\nSolution #" + strconv.Itoa(solutionIndex+1) + ":") render += fmt.Sprintln(solution) diff --git a/export/renderHumanReadableSolutions.go b/export/renderHumanReadable.go similarity index 80% rename from export/renderHumanReadableSolutions.go rename to export/renderHumanReadable.go index 9b13c6e..424a7ff 100644 --- a/export/renderHumanReadableSolutions.go +++ b/export/renderHumanReadable.go @@ -5,8 +5,8 @@ import ( "strconv" ) -// Print solutions into a human friendly format for in the console. -func (export *Export) RenderHumanReadableSolutions() (render string) { +// Render solutions in a human friendly format. +func (export *Export) renderHumanReadable() (render string) { for solutionIndex, solution := range export.Controller.Solutions { render += fmt.Sprintln("\nSolution #" + strconv.Itoa(solutionIndex+1) + ":") render += fmt.Sprintln("╔═══════════╗") diff --git a/export/renderJSON.go b/export/renderJSON.go new file mode 100644 index 0000000..101f497 --- /dev/null +++ b/export/renderJSON.go @@ -0,0 +1,36 @@ +package export + +import ( + "encoding/json" + "log" +) + +// Render JSON output. +func (export *Export) renderJSON() (render string) { + type solution_type map[string]any + solutions := make([]solution_type, 0) + + for solutionIndex, solution := range export.Controller.Solutions { + solutionMap := map[string]any{ + "order": solutionIndex, + "row1": solution[0], + "row2": solution[1], + "row3": solution[2], + "row4": solution[3], + "row5": solution[4], + "row6": solution[5], + "row7": solution[6], + "row8": solution[7], + "row9": solution[8], + } + solutions = append(solutions, solutionMap) + } + renderBytes, err := json.Marshal(solutions) + if err != nil { + log.Println("ERROR: json.Marshal error:", err) + log.Println("Printing solution as-is:", solutions) + return "" + } + render = string(renderBytes) + return +} diff --git a/flags/ParseFlags.go b/flags/ParseFlags.go index f8175b0..9759851 100644 --- a/flags/ParseFlags.go +++ b/flags/ParseFlags.go @@ -24,7 +24,7 @@ func (flags *Flags) ParseFlags() { flag.IntVar(&flags.Controller.NumCPUs, "numcpu", runtime.NumCPU(), "Number of CPU cores to assign to this task.") flag.IntVar(&flags.Controller.Split, "split", 1, "Split the tasks in n parts. This depends on the availability of the first row.") flag.IntVar(&flags.Controller.Part, "part", 1, "Process part x in n parts. Cannot be lower than 1, or higher than specified in split.") - flag.StringVar(&flags.Controller.Output, "output", "human", "Type of output. 'human' for human readable. 'flat' for flat as stored in memory output.") + flag.StringVar(&flags.Controller.Output, "output", "human", "Type of output. 'human' for human readable. 'flat' for flat as stored in memory output. 'json' for JSON output.") // Parse the flags flag.Parse() @@ -75,7 +75,7 @@ func (flags *Flags) ParseFlags() { // Process output selection flags.Controller.Output = strings.ToLower(flags.Controller.Output) - if flags.Controller.Output != "human" && flags.Controller.Output != "flat" { + if flags.Controller.Output != "human" && flags.Controller.Output != "flat" && flags.Controller.Output != "json" { log.Printf("ERROR: Invalid output, can only be 'human' or 'flat'.\n") flags.printUsage() os.Exit(1)