Add JSON render + small refactoring (Closes #25)

This commit is contained in:
Sacha Ligthert 2025-01-28 19:50:42 +01:00
parent 71fefd760e
commit 2bdcdcb1dd
5 changed files with 46 additions and 8 deletions

View File

@ -4,9 +4,11 @@ func (export *Export) Export() (render string) {
// Print the valid solutions // Print the valid solutions
switch export.Controller.Output { switch export.Controller.Output {
case "human": case "human":
render = export.RenderHumanReadableSolutions() render = export.renderHumanReadable()
case "flat": case "flat":
render = export.renderFlatSolutions() render = export.renderFlat()
case "json":
render = export.renderJSON()
} }
return return
} }

View File

@ -5,8 +5,8 @@ import (
"strconv" "strconv"
) )
// Print solutions into a human friendly format for in the console. // Render output as stored internally.
func (export *Export) renderFlatSolutions() (render string) { func (export *Export) renderFlat() (render string) {
for solutionIndex, solution := range export.Controller.Solutions { for solutionIndex, solution := range export.Controller.Solutions {
render += fmt.Sprintln("\nSolution #" + strconv.Itoa(solutionIndex+1) + ":") render += fmt.Sprintln("\nSolution #" + strconv.Itoa(solutionIndex+1) + ":")
render += fmt.Sprintln(solution) render += fmt.Sprintln(solution)

View File

@ -5,8 +5,8 @@ import (
"strconv" "strconv"
) )
// Print solutions into a human friendly format for in the console. // Render solutions in a human friendly format.
func (export *Export) RenderHumanReadableSolutions() (render string) { func (export *Export) renderHumanReadable() (render string) {
for solutionIndex, solution := range export.Controller.Solutions { for solutionIndex, solution := range export.Controller.Solutions {
render += fmt.Sprintln("\nSolution #" + strconv.Itoa(solutionIndex+1) + ":") render += fmt.Sprintln("\nSolution #" + strconv.Itoa(solutionIndex+1) + ":")
render += fmt.Sprintln("╔═══════════╗") render += fmt.Sprintln("╔═══════════╗")

36
export/renderJSON.go Normal file
View File

@ -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
}

View File

@ -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.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.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.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 // Parse the flags
flag.Parse() flag.Parse()
@ -75,7 +75,7 @@ func (flags *Flags) ParseFlags() {
// Process output selection // Process output selection
flags.Controller.Output = strings.ToLower(flags.Controller.Output) 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") log.Printf("ERROR: Invalid output, can only be 'human' or 'flat'.\n")
flags.printUsage() flags.printUsage()
os.Exit(1) os.Exit(1)