ParseFlags.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. package flags
  2. import (
  3. "flag"
  4. "log"
  5. "os"
  6. "runtime"
  7. "strings"
  8. )
  9. // Parse command-line parameters, test input, store them in the Controller.
  10. func (flags *Flags) ParseFlags() {
  11. // Define parameters
  12. flag.StringVar(&flags.Controller.Row1, "row1", "000000000", "1st row of the sudoku puzzle.")
  13. flag.StringVar(&flags.Controller.Row2, "row2", "000000000", "2nd row of the sudoku puzzle.")
  14. flag.StringVar(&flags.Controller.Row3, "row3", "000000000", "4rd row of the sudoku puzzle.")
  15. flag.StringVar(&flags.Controller.Row4, "row4", "000000000", "4th row of the sudoku puzzle.")
  16. flag.StringVar(&flags.Controller.Row5, "row5", "000000000", "5th row of the sudoku puzzle.")
  17. flag.StringVar(&flags.Controller.Row6, "row6", "000000000", "6th row of the sudoku puzzle.")
  18. flag.StringVar(&flags.Controller.Row7, "row7", "000000000", "7th row of the sudoku puzzle.")
  19. flag.StringVar(&flags.Controller.Row8, "row8", "000000000", "8th row of the sudoku puzzle.")
  20. flag.StringVar(&flags.Controller.Row9, "row9", "000000000", "9th row of the sudoku puzzle.")
  21. flag.IntVar(&flags.Controller.NumCPUs, "numcpu", runtime.NumCPU(), "Number of CPU cores to assign to this task.")
  22. flag.IntVar(&flags.Controller.Split, "split", 1, "Split the tasks in n parts. This depends on the availability of the first row.")
  23. flag.IntVar(&flags.Controller.Part, "part", 1, "Process part x in n parts. Cannot be lower than 1, or higher than specified in split.")
  24. 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.")
  25. // Parse the flags
  26. flag.Parse()
  27. // Process any changes to the CPU usage.
  28. if flags.Controller.NumCPUs <= 0 {
  29. log.Printf("ERROR: Number of CPU cores must be 1 or higher.\n\n")
  30. flags.printUsage()
  31. os.Exit(1)
  32. }
  33. if flags.Controller.NumCPUs != runtime.NumCPU() {
  34. runtime.GOMAXPROCS(flags.Controller.NumCPUs)
  35. }
  36. // Process rows
  37. 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" {
  38. log.Printf("ERROR: All parameters must be entered.\n\n")
  39. flags.printUsage()
  40. os.Exit(1)
  41. }
  42. // Validate the row (never trust user input)
  43. flags.validateRow("row1", flags.Controller.Row1)
  44. flags.validateRow("row2", flags.Controller.Row2)
  45. flags.validateRow("row3", flags.Controller.Row3)
  46. flags.validateRow("row4", flags.Controller.Row4)
  47. flags.validateRow("row5", flags.Controller.Row5)
  48. flags.validateRow("row6", flags.Controller.Row6)
  49. flags.validateRow("row7", flags.Controller.Row7)
  50. flags.validateRow("row8", flags.Controller.Row8)
  51. flags.validateRow("row9", flags.Controller.Row9)
  52. // Process workload splitting
  53. // Ensure split and part are 1 or higher
  54. if flags.Controller.Split <= 0 || flags.Controller.Part <= 0 {
  55. log.Printf("ERROR: '-split' and '-part' need to be 1 or higher.\n")
  56. flags.printUsage()
  57. os.Exit(1)
  58. }
  59. // Ensure part is between 1 and split
  60. if flags.Controller.Part > flags.Controller.Split {
  61. log.Printf("ERROR: '-part' cannot be bigger than `-split`.\n")
  62. flags.printUsage()
  63. os.Exit(1)
  64. }
  65. // Process output selection
  66. flags.Controller.Output = strings.ToLower(flags.Controller.Output)
  67. if flags.Controller.Output != "human" && flags.Controller.Output != "flat" && flags.Controller.Output != "json" {
  68. log.Printf("ERROR: Invalid output, can only be 'human' or 'flat'.\n")
  69. flags.printUsage()
  70. os.Exit(1)
  71. }
  72. }