-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
85 lines (73 loc) · 1.99 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
package main
import (
"errors"
"flag"
"fmt"
"os"
"strings"
"samjay/aoc2023-golang/puzzles"
)
type Args struct {
puzzleNum *int
partOneMode *string
partTwoMode *string
}
func main() {
// Handle command line args
args := parseArgs()
validationErr := validateArgs(args)
if validationErr != nil {
fmt.Fprintln(os.Stderr, validationErr.Error())
os.Exit(1)
}
fmt.Printf(
"Solving puzzle %d (part 1 in %s mode, part 2 in %s mode)\r\n\r\n",
*args.puzzleNum,
*args.partOneMode,
*args.partTwoMode,
)
solveErr := puzzles.Solve(
*args.puzzleNum,
*args.partOneMode,
*args.partTwoMode,
)
if solveErr != nil {
fmt.Fprintln(os.Stderr, solveErr.Error())
os.Exit(1)
}
}
func parseArgs() Args {
// Define and parse cmd line args
args := Args {
puzzleNum: flag.Int("number", 1, "Which puzzle to solve"),
partOneMode: flag.String(
"part-one-mode",
"test",
"Which input file to use to solve part 1 (test or full)",
),
partTwoMode: flag.String(
"part-two-mode",
"test",
"Which input file to use to solve part 2 (test or full)",
),
}
flag.Parse()
return args
}
func validateArgs(args Args) error {
var messages []string
if *args.puzzleNum < 1 || *args.puzzleNum > 25 {
messages = append(messages, "Invalid puzzle number! Should be between 1 and 25.")
}
if *args.partOneMode != "test" && *args.partOneMode != "full" {
messages = append(messages, "Invalid part one mode! Needs to be \"full\" or \"test\".")
}
if *args.partTwoMode != "test" && *args.partTwoMode != "full" {
messages = append(messages, "Invalid part two mode! Needs to be \"full\" or \"test\".")
}
if len(messages) > 0 {
message := strings.Join(messages[:], "\r\n")
return errors.New(message)
}
return nil
}