diff --git a/gleam.toml b/gleam.toml index fc769a3..c7b4950 100644 --- a/gleam.toml +++ b/gleam.toml @@ -20,9 +20,9 @@ gleam_erlang = ">= 1.3.0 and < 2.0.0" gleam_otp = ">= 1.2.0 and < 2.0.0" glint = ">= 1.2.1 and < 2.0.0" argv = ">= 1.0.2 and < 2.0.0" -glemplate = ">= 8.1.1 and < 9.0.0" gleam_yielder = ">= 1.1.0 and < 2.0.0" gleam_deque = ">= 1.0.0 and < 2.0.0" +handles = ">= 5.0.0 and < 6.0.0" [dev-dependencies] gleeunit = ">= 1.0.0 and < 2.0.0" diff --git a/manifest.toml b/manifest.toml index 742aae1..337c04d 100644 --- a/manifest.toml +++ b/manifest.toml @@ -11,15 +11,12 @@ packages = [ { name = "gleam_json", version = "3.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_json", source = "hex", outer_checksum = "44FDAA8847BE8FC48CA7A1C089706BD54BADCC4C45B237A992EDDF9F2CDB2836" }, { name = "gleam_otp", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_erlang", "gleam_stdlib"], otp_app = "gleam_otp", source = "hex", outer_checksum = "BA6A294E295E428EC1562DC1C11EA7530DCB981E8359134BEABC8493B7B2258E" }, { name = "gleam_regexp", version = "1.1.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_regexp", source = "hex", outer_checksum = "9C215C6CA84A5B35BB934A9B61A9A306EC743153BE2B0425A0D032E477B062A9" }, - { name = "gleam_stdlib", version = "0.67.0", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "6368313DB35963DC02F677A513BB0D95D58A34ED0A9436C8116820BF94BE3511" }, + { name = "gleam_stdlib", version = "0.67.1", build_tools = ["gleam"], requirements = [], otp_app = "gleam_stdlib", source = "hex", outer_checksum = "6CE3E4189A8B8EC2F73AB61A2FBDE49F159D6C9C61C49E3B3082E439F260D3D0" }, { name = "gleam_time", version = "1.6.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_time", source = "hex", outer_checksum = "0DF3834D20193F0A38D0EB21F0A78D48F2EC276C285969131B86DF8D4EF9E762" }, { name = "gleam_yielder", version = "1.1.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleam_yielder", source = "hex", outer_checksum = "8E4E4ECFA7982859F430C57F549200C7749823C106759F4A19A78AEA6687717A" }, { name = "gleeunit", version = "1.9.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "gleeunit", source = "hex", outer_checksum = "DA9553CE58B67924B3C631F96FE3370C49EB6D6DC6B384EC4862CC4AAA718F3C" }, - { name = "glemplate", version = "8.1.1", build_tools = ["gleam"], requirements = ["gleam_stdlib", "glentities", "nibble"], otp_app = "glemplate", source = "hex", outer_checksum = "060C160F6160809C27E2E41E73543BC998CB7C6B101F5669C394DEDC2EA2F12C" }, - { name = "glentities", version = "6.2.1", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "glentities", source = "hex", outer_checksum = "78A0B28789C1A7840468C683FC9588B0B59AA38BE8CF5DACD1AF2E60A91AE638" }, { name = "glint", version = "1.2.1", build_tools = ["gleam"], requirements = ["gleam_community_ansi", "gleam_community_colour", "gleam_stdlib", "snag"], otp_app = "glint", source = "hex", outer_checksum = "2214C7CEFDE457CEE62140C3D4899B964E05236DA74E4243DFADF4AF29C382BB" }, - { name = "iv", version = "1.3.3", build_tools = ["gleam"], requirements = ["gleam_stdlib", "gleam_yielder"], otp_app = "iv", source = "hex", outer_checksum = "F5A65B2BAB2747DEFEB756F7F1DF63D776F4445EE9679AE0A2442F73CAE68B13" }, - { name = "nibble", version = "1.1.4", build_tools = ["gleam"], requirements = ["gleam_regexp", "gleam_stdlib", "iv"], otp_app = "nibble", source = "hex", outer_checksum = "06397501730FF486AE6F99299982A33F5EA9F8945B5A25920C82C8F924CEA481" }, + { name = "handles", version = "5.0.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "handles", source = "hex", outer_checksum = "99967BED02558973B5C55EF36264661F0E4BC4E672EB85D970D6FF7A774FAC7A" }, { name = "simplifile", version = "2.3.1", build_tools = ["gleam"], requirements = ["filepath", "gleam_stdlib"], otp_app = "simplifile", source = "hex", outer_checksum = "957E0E5B75927659F1D2A1B7B75D7B9BA96FAA8D0C53EA71C4AD9CD0C6B848F6" }, { name = "snag", version = "1.2.0", build_tools = ["gleam"], requirements = ["gleam_stdlib"], otp_app = "snag", source = "hex", outer_checksum = "274F41D6C3ECF99F7686FDCE54183333E41D2C1CA5A3A673F9A8B2C7A4401077" }, ] @@ -33,6 +30,6 @@ gleam_stdlib = { version = ">= 0.44.0 and < 2.0.0" } gleam_time = { version = ">= 1.6.0 and < 2.0.0" } gleam_yielder = { version = ">= 1.1.0 and < 2.0.0" } gleeunit = { version = ">= 1.0.0 and < 2.0.0" } -glemplate = { version = ">= 8.1.1 and < 9.0.0" } glint = { version = ">= 1.2.1 and < 2.0.0" } +handles = { version = ">= 5.0.0 and < 6.0.0" } simplifile = { version = ">= 2.3.1 and < 3.0.0" } diff --git a/src/aoc2025.gleam b/src/aoc2025.gleam index 6c25f6f..2ec3848 100644 --- a/src/aoc2025.gleam +++ b/src/aoc2025.gleam @@ -1,14 +1,13 @@ import argv -import gleam/dict import gleam/int import gleam/io import gleam/result import gleam/string import gleam/string_tree -import glemplate/assigns -import glemplate/parser -import glemplate/text import glint +import handles +import handles/ctx +import handles/format import simplifile pub fn main() -> Nil { @@ -58,7 +57,6 @@ fn new_day() -> glint.Command(Nil) { } fn generate_template(day_number) -> Result(Nil, Nil) { - let p = parser.new() use sol_input <- result.try( simplifile.read(from: "templates/solution.gleam") |> result.map_error(fn(e) { @@ -80,36 +78,67 @@ fn generate_template(day_number) -> Result(Nil, Nil) { ) use sol_template <- result.try( - parser.parse_to_template(sol_input, "solution.gleam", p) + handles.prepare(sol_input) |> result.map_error(fn(e) { - io.println_error("Error parsing solution.gleam: " <> string.inspect(e)) + case + format.format_tokenizer_error( + e, + "Error parsing solution.gleam: {{ . }}", + ) + { + Error(_) -> io.println_error("Unknown error parsing solution.gleam") + Ok(v) -> io.println_error(v) + } }), ) use test_template <- result.try( - parser.parse_to_template(test_input, "dayXX_test.gleam", p) + handles.prepare(test_input) |> result.map_error(fn(e) { - io.println_error("Error parsing dayXX_test.gleam: " <> string.inspect(e)) + case + format.format_tokenizer_error( + e, + "Error parsing dayXX_test.gleam: {{ . }}", + ) + { + Error(_) -> io.println_error("Unknown error parsing dayXX_test.gleam") + Ok(v) -> io.println_error(v) + } }), ) let day_value = day_number |> int.to_string |> string.pad_start(to: 2, with: "0") - let vals = dict.from_list([#("day", assigns.String(day_value))]) - use sol_tree <- result.try( - text.render(sol_template, vals, dict.new()) + handles.run(sol_template, ctx.Str(day_value), []) |> result.map_error(fn(e) { - io.println_error("Error rendering solution.gleam: " <> string.inspect(e)) + case + format.format_runtime_error( + e, + "Error rendering solution.gleam: {{ . }}", + ) + { + Error(_) -> io.println_error("Unknown error rendering solution.gleam") + Ok(v) -> io.println_error(v) + } }), ) use test_tree <- result.try( - text.render(test_template, vals, dict.new()) + handles.run(test_template, ctx.Str(day_value), []) |> result.map_error(fn(e) { - io.println_error( - "Error rendering dayXX_test.gleam: " <> string.inspect(e), - ) + case + format.format_runtime_error( + e, + "Error rendering day" <> day_value <> "_test.gleam: {{ . }}", + ) + { + Error(_) -> + io.println_error( + "Unknown error rendering day" <> day_value <> "_test.gleam", + ) + Ok(v) -> io.println_error(v) + } }), ) diff --git a/templates/dayXX_test.gleam b/templates/dayXX_test.gleam index e4aa795..f492877 100644 --- a/templates/dayXX_test.gleam +++ b/templates/dayXX_test.gleam @@ -1,4 +1,4 @@ -import day<%= day %>/solution +import day{{ . }}/solution import gleam/string const testinput = "" diff --git a/templates/solution.gleam b/templates/solution.gleam index ca63e24..9412150 100644 --- a/templates/solution.gleam +++ b/templates/solution.gleam @@ -2,7 +2,7 @@ import gleam/io import internal/aoc_utils pub fn main() { - let filename = "inputs/day<%= day%>.txt" + let filename = "inputs/day{{ . }}.txt" let lines_result = aoc_utils.read_lines(from: filename) case lines_result {