-
Notifications
You must be signed in to change notification settings - Fork 0
/
day.gleam
110 lines (96 loc) · 3.05 KB
/
day.gleam
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
import adglent
import gleam/string
import gleam/result
import priv/template
import priv/templates/testfile_gleeunit
import priv/templates/testfile_showtime
import priv/templates/solution
import priv/toml
import priv/aoc_client
import priv/errors
import simplifile
pub fn main() {
let day =
case adglent.start_arguments() {
[day] -> Ok(day)
args -> Error("Expected day - found: " <> string.join(args, ", "))
}
|> errors.map_error("Error when parsing command args")
|> errors.print_error
|> errors.assert_ok
let aoc_toml =
simplifile.read("aoc.toml")
|> errors.map_error("Could not read aoc.toml")
|> errors.print_error
|> errors.assert_ok
let year =
toml.get_string(aoc_toml, ["year"])
|> errors.map_error("Could not read \"year\" from aoc.toml")
|> errors.print_error
|> errors.assert_ok
let session =
toml.get_string(aoc_toml, ["session"])
|> errors.map_error("Could not read \"session\" from aoc.toml")
|> errors.print_error
|> errors.assert_ok
let showtime =
toml.get_bool(aoc_toml, ["showtime"])
|> errors.map_error("Could not read \"showtime\" from aoc.toml")
|> errors.print_error
|> errors.assert_ok
let test_folder = adglent.get_test_folder(day)
let test_file = test_folder <> "/day" <> day <> "_test.gleam"
simplifile.create_directory_all(test_folder)
|> errors.map_error("Could not create folder \"" <> test_folder <> "\"")
|> errors.print_error
|> errors.assert_ok
let testfile_template = case showtime {
True -> testfile_showtime.template
False -> testfile_gleeunit.template
}
template.render(testfile_template, [#("day", day)])
|> create_file_if_not_present(test_file)
|> errors.print_result
|> errors.assert_ok
let solutions_folder = "src/day" <> day
let solution_file = solutions_folder <> "/solve.gleam"
simplifile.create_directory_all(solutions_folder)
|> errors.map_error("Could not create folder \"" <> solutions_folder <> "\"")
|> errors.print_error
|> errors.assert_ok
template.render(solution.template, [#("day", day)])
|> create_file_if_not_present(solution_file)
|> errors.print_result
|> errors.assert_ok
create_file_if_not_present("input.txt", solutions_folder <> "/.gitignore")
|> errors.print_result
|> errors.assert_ok
let input =
aoc_client.get_input(year, day, session)
|> errors.map_error("Error when fetching input")
|> errors.print_error
|> errors.assert_ok
input
|> string.trim
|> create_file_if_not_present(solutions_folder <> "/input.txt")
|> errors.print_result
|> errors.assert_ok
}
fn create_file_if_not_present(
content: String,
path: String,
) -> Result(String, String) {
case simplifile.is_file(path) {
True -> {
Ok(path <> " already exists - skipped")
}
False -> {
use _ <- result.try(
simplifile.create_file(path)
|> errors.map_messages("Created " <> path, "Could not create " <> path),
)
simplifile.write(content, to: path)
|> errors.map_messages("Wrote " <> path, "Could not write to " <> path)
}
}
}