diff options
Diffstat (limited to 'aoc24/tools/download_input.zig')
-rw-r--r-- | aoc24/tools/download_input.zig | 39 |
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(); +} |