2025-01-28 00:07:06 +01:00
package flags
import (
"flag"
2025-01-28 21:02:12 +01:00
"fmt"
2025-01-28 00:07:06 +01:00
"os"
"runtime"
2025-01-28 01:04:38 +01:00
"strings"
2025-01-28 00:07:06 +01:00
)
2025-01-28 00:31:02 +01:00
// Parse command-line parameters, test input, store them in the Controller.
2025-01-28 00:07:06 +01:00
func ( flags * Flags ) ParseFlags ( ) {
// Define parameters
flag . StringVar ( & flags . Controller . Row1 , "row1" , "000000000" , "1st row of the sudoku puzzle." )
flag . StringVar ( & flags . Controller . Row2 , "row2" , "000000000" , "2nd row of the sudoku puzzle." )
flag . StringVar ( & flags . Controller . Row3 , "row3" , "000000000" , "4rd row of the sudoku puzzle." )
flag . StringVar ( & flags . Controller . Row4 , "row4" , "000000000" , "4th row of the sudoku puzzle." )
flag . StringVar ( & flags . Controller . Row5 , "row5" , "000000000" , "5th row of the sudoku puzzle." )
flag . StringVar ( & flags . Controller . Row6 , "row6" , "000000000" , "6th row of the sudoku puzzle." )
flag . StringVar ( & flags . Controller . Row7 , "row7" , "000000000" , "7th row of the sudoku puzzle." )
flag . StringVar ( & flags . Controller . Row8 , "row8" , "000000000" , "8th row of the sudoku puzzle." )
flag . StringVar ( & flags . Controller . Row9 , "row9" , "000000000" , "9th row of the sudoku puzzle." )
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." )
2025-01-28 19:50:42 +01:00
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." )
2025-01-28 21:02:12 +01:00
flag . StringVar ( & flags . Controller . Print , "print" , "short" , "'short': normal output;'long': normal output with timestamps; 'silent': Only print the results;" )
2025-01-28 00:07:06 +01:00
// Parse the flags
flag . Parse ( )
// Process any changes to the CPU usage.
if flags . Controller . NumCPUs <= 0 {
2025-01-28 21:02:12 +01:00
fmt . Printf ( "ERROR: Number of CPU cores must be 1 or higher.\n\n" )
2025-01-28 00:07:06 +01:00
flags . printUsage ( )
os . Exit ( 1 )
}
if flags . Controller . NumCPUs != runtime . NumCPU ( ) {
runtime . GOMAXPROCS ( flags . Controller . NumCPUs )
}
// Process rows
if flags . Controller . Row1 == "000000000" || flags . Controller . Row2 == "000000000" || flags . Controller . Row3 == "000000000" || flags . Controller . Row4 == "000000000" || flags . Controller . Row5 == "000000000" || flags . Controller . Row6 == "000000000" || flags . Controller . Row7 == "000000000" || flags . Controller . Row8 == "000000000" || flags . Controller . Row9 == "000000000" {
2025-01-28 21:02:12 +01:00
fmt . Printf ( "ERROR: All parameters must be entered.\n\n" )
2025-01-28 00:07:06 +01:00
flags . printUsage ( )
os . Exit ( 1 )
}
// Validate the row (never trust user input)
flags . validateRow ( "row1" , flags . Controller . Row1 )
flags . validateRow ( "row2" , flags . Controller . Row2 )
flags . validateRow ( "row3" , flags . Controller . Row3 )
flags . validateRow ( "row4" , flags . Controller . Row4 )
flags . validateRow ( "row5" , flags . Controller . Row5 )
flags . validateRow ( "row6" , flags . Controller . Row6 )
flags . validateRow ( "row7" , flags . Controller . Row7 )
flags . validateRow ( "row8" , flags . Controller . Row8 )
flags . validateRow ( "row9" , flags . Controller . Row9 )
// Process workload splitting
// Ensure split and part are 1 or higher
if flags . Controller . Split <= 0 || flags . Controller . Part <= 0 {
2025-01-28 21:02:12 +01:00
fmt . Printf ( "ERROR: '-split' and '-part' need to be 1 or higher.\n" )
2025-01-28 00:07:06 +01:00
flags . printUsage ( )
os . Exit ( 1 )
}
// Ensure part is between 1 and split
if flags . Controller . Part > flags . Controller . Split {
2025-01-28 21:02:12 +01:00
fmt . Printf ( "ERROR: '-part' cannot be bigger than `-split`.\n" )
2025-01-28 00:07:06 +01:00
flags . printUsage ( )
os . Exit ( 1 )
}
2025-01-28 01:04:38 +01:00
// Process output selection
flags . Controller . Output = strings . ToLower ( flags . Controller . Output )
2025-01-28 19:50:42 +01:00
if flags . Controller . Output != "human" && flags . Controller . Output != "flat" && flags . Controller . Output != "json" {
2025-01-28 21:02:12 +01:00
fmt . Printf ( "ERROR: Invalid output, can only be 'human' or 'flat' or 'json'.\n" )
flags . printUsage ( )
os . Exit ( 1 )
}
// Process print selection
flags . Controller . Print = strings . ToLower ( flags . Controller . Print )
if flags . Controller . Print != "short" && flags . Controller . Print != "long" && flags . Controller . Print != "silent" {
fmt . Printf ( "ERROR: Invalid Print, can only be 'short' or 'long' or 'silent'.\n" )
2025-01-28 01:04:38 +01:00
flags . printUsage ( )
os . Exit ( 1 )
}
2025-01-28 00:07:06 +01:00
}