summaryrefslogtreecommitdiff
path: root/aoc24/tools/download_input.zig
diff options
context:
space:
mode:
authorMathias Magnusson <mathias@magnusson.space>2024-12-03 14:26:04 +0100
committerMathias Magnusson <mathias@magnusson.space>2024-12-03 14:36:12 +0100
commitbf494891a715080dde14753b51befb463a6c246f (patch)
treea1be0795f4d3b8db29f0f5569183989d3d23f6fc /aoc24/tools/download_input.zig
parent0c01b3924d55e0923cf895254b9412c9cedc9047 (diff)
downloadprogramming-problem-solving-bf494891a715080dde14753b51befb463a6c246f.tar.gz
aoc2024: make build tool download input & add shared main function
Diffstat (limited to 'aoc24/tools/download_input.zig')
-rw-r--r--aoc24/tools/download_input.zig39
1 files changed, 39 insertions, 0 deletions
diff --git a/aoc24/tools/download_input.zig b/aoc24/tools/download_input.zig
new file mode 100644
index 0000000..87c229a
--- /dev/null
+++ b/aoc24/tools/download_input.zig
@@ -0,0 +1,39 @@
+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();
+
+ const url = try std.fmt.allocPrint(allocator, "https://adventofcode.com/2024/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 response = std.ArrayList(u8).init(allocator);
+ var client = std.http.Client{ .allocator = allocator };
+ const result = try client.fetch(.{
+ .location = .{ .url = url },
+ .response_storage = .{ .dynamic = &response },
+ .extra_headers = &[_]std.http.Header{
+ .{ .name = "Cookie", .value = session_cookie_header },
+ },
+ });
+ if (result.status != .ok) return error.InvalidStatusCode;
+
+ try output_file.writeAll(response.items);
+ return std.process.cleanExit();
+}