72 lines
1.2 KiB
Go
72 lines
1.2 KiB
Go
package main
|
|
|
|
import (
|
|
_ "embed"
|
|
"fmt"
|
|
"os"
|
|
"path/filepath"
|
|
"strconv"
|
|
"text/template"
|
|
)
|
|
|
|
//go:embed main.tmpl
|
|
var content string
|
|
|
|
type Data struct{ N int }
|
|
|
|
func main() {
|
|
if err := Main(); err != nil {
|
|
fmt.Fprintln(os.Stderr, err.Error())
|
|
os.Exit(1)
|
|
}
|
|
}
|
|
|
|
func Main() error {
|
|
t, err := template.New("main").Parse(content)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
n, err := strconv.Atoi(os.Args[1])
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
dir := fmt.Sprintf("day%d", n)
|
|
if err := os.MkdirAll(dir, 0o755); err != nil {
|
|
return err
|
|
}
|
|
|
|
main := filepath.Join(dir, "main.go")
|
|
if err := writeMain(t, Data{N: n}, main); err != nil {
|
|
return err
|
|
}
|
|
|
|
input := filepath.Join("input", fmt.Sprintf("day%d.txt", n))
|
|
if err := touch(input); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func writeMain(t *template.Template, data Data, path string) error {
|
|
f, err := os.OpenFile(path, os.O_WRONLY|os.O_CREATE|os.O_EXCL, 0o644)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
// Prefer the write error over the close error.
|
|
werr := t.Execute(f, data)
|
|
cerr := f.Close()
|
|
if werr != nil {
|
|
return werr
|
|
}
|
|
return cerr
|
|
}
|
|
|
|
func touch(path string) error {
|
|
f, err := os.Create(path)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return f.Close()
|
|
}
|