summaryrefslogtreecommitdiff
path: root/aoc25/tools/download_input.zig
diff options
context:
space:
mode:
Diffstat (limited to 'aoc25/tools/download_input.zig')
-rw-r--r--aoc25/tools/download_input.zig41
1 files changed, 41 insertions, 0 deletions
diff --git a/aoc25/tools/download_input.zig b/aoc25/tools/download_input.zig
new file mode 100644
index 0000000..3fae78c
--- /dev/null
+++ b/aoc25/tools/download_input.zig
@@ -0,0 +1,41 @@
+const std = @import("std");
+
+pub fn main() !void {
+ std.debug.print("Downloading input from adventofcode.com\n", .{});
+
+ var arena = std.heap.ArenaAllocator.init(std.heap.page_allocator);
+ defer arena.deinit();
+ const allocator = arena.allocator();
+
+ const args = try std.process.argsAlloc(allocator);
+
+ if (args.len != 3) return error.InvalidArguments;
+
+ const day = try std.fmt.parseInt(u32, args[1], 10);
+ const output_file_path = args[2];
+
+ var output_file = try std.fs.cwd().createFile(output_file_path, .{});
+ defer output_file.close();
+ var output_buffer: [4096]u8 = undefined;
+ var output_writer = output_file.writer(&output_buffer);
+ var output = &output_writer.interface;
+
+ const url = try std.fmt.allocPrint(allocator, "https://adventofcode.com/2025/day/{}/input", .{day});
+ defer allocator.free(url);
+ const session_cookie_header = try std.fmt.allocPrint(allocator, "session={s}", .{
+ std.posix.getenv("AOC_SESSION") orelse return error.MissingAocSession,
+ });
+ defer allocator.free(session_cookie_header);
+ var client = std.http.Client{ .allocator = allocator };
+ const result = try client.fetch(.{
+ .location = .{ .url = url },
+ .response_writer = output,
+ .extra_headers = &[_]std.http.Header{
+ .{ .name = "Cookie", .value = session_cookie_header },
+ },
+ });
+ if (result.status != .ok) return error.InvalidStatusCode;
+
+ try output.flush();
+ return std.process.cleanExit();
+}