-
Notifications
You must be signed in to change notification settings - Fork 0
/
generate.go
136 lines (111 loc) · 3.53 KB
/
generate.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
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
/*
Copyright © 2022 NAME HERE <EMAIL ADDRESS>
*/
package cmd
import (
"fmt"
"io/fs"
"log"
"os"
"strconv"
"text/template"
"time"
"github.com/pkg/errors"
"github.com/spf13/cobra"
)
type dayData struct {
Pkg string
Day int
}
// generateCmd represents the generate command
var generateCmd = &cobra.Command{
Use: "generate",
Short: "Generates a folder with files with correct package names",
Long: `Takes the argument or the flag value and generates a new folder for that day adjusting the package names as
needed. If both an argument and a flag are supplied, the flag gets higher priority.
Usage:
$ aoc22 generate 21
// generates folder 'day21' with package name 'day21' set
$ aoc22 generate --day 19
// generates folder 'day19', same as above
$ aoc22 generate 9 --day 14
// generates folder 'day14'`,
Run: func(cmd *cobra.Command, args []string) {
day := time.Now().Day()
if len(args) > 0 {
maybe, err := strconv.Atoi(args[0])
if err != nil {
log.Fatalf("First argument is not an integer: %s", err.Error())
}
if maybe < 1 || maybe > 31 {
log.Fatalf("Specified day is outside of the valid 1-31 range. Got %d", maybe)
}
log.Printf("Day was specified, continuing with value %d\n", maybe)
day = maybe
} else {
log.Printf("No day was specified, using today's: %d\n", day)
}
dirName := fmt.Sprintf("day%d", day)
// dir exists
_, err := os.ReadDir(dirName)
if err == nil {
log.Fatalf("Directory for day %d already exists, aborting", day)
}
if !errors.Is(err, fs.ErrNotExist) {
log.Fatalf("Reading directory encountered an unexpected error, aborting.Error got: %s", err.Error())
}
templateData := dayData{
Pkg: dirName,
Day: day,
}
tps, err := template.ParseFiles("dayn/part1.go.tpl", "dayn/part2.go.tpl", "dayn/readme.md.tpl")
if err != nil {
log.Fatalf("Parsing template files encountered an error: %s", err.Error())
}
err = os.Mkdir(dirName, 0755)
if err != nil {
log.Fatalf("Creating the directory %s failed: %s", dirName, err.Error())
}
p1, err := os.OpenFile(dirName+"/part1.go", os.O_RDWR|os.O_TRUNC|os.O_CREATE, 0755)
if err != nil {
log.Fatalf("Creating file 'part1.go' failed: %s", err.Error())
}
defer p1.Close()
p2, err := os.OpenFile(dirName+"/part2.go", os.O_RDWR|os.O_TRUNC|os.O_CREATE, 0755)
if err != nil {
log.Fatalf("Creating file 'part2.go' failed: %s", err.Error())
}
defer p2.Close()
rdme, err := os.OpenFile(dirName+"/readme.md", os.O_RDWR|os.O_TRUNC|os.O_CREATE, 0755)
if err != nil {
log.Fatalf("Creating file 'readme.md' failed: %s", err.Error())
}
defer rdme.Close()
i1, err := os.OpenFile(dirName+"/input1.txt", os.O_RDWR|os.O_TRUNC|os.O_CREATE, 0755)
if err != nil {
log.Fatalf("Creating file 'readme.md' failed: %s", err.Error())
}
defer i1.Close()
i2, err := os.OpenFile(dirName+"/input2.txt", os.O_RDWR|os.O_TRUNC|os.O_CREATE, 0755)
if err != nil {
log.Fatalf("Creating file 'readme.md' failed: %s", err.Error())
}
defer i2.Close()
err = tps.ExecuteTemplate(p1, "part1.go.tpl", templateData)
if err != nil {
log.Fatalf("Executing template for 'part1.go' failed: %s", err)
}
err = tps.ExecuteTemplate(p2, "part2.go.tpl", templateData)
if err != nil {
log.Fatalf("Executing template for 'part2.go' failed: %s", err)
}
err = tps.ExecuteTemplate(rdme, "readme.md.tpl", templateData)
if err != nil {
log.Fatalf("Executing template for 'readme.md' failed: %s", err)
}
log.Printf("Folder for %s generated, all good!", dirName)
},
}
func init() {
rootCmd.AddCommand(generateCmd)
}