summaryrefslogtreecommitdiff
path: root/aoc24/tools/download_input.zig
blob: 87c229ab4f8299340bd5ad42389292d0ca78d035 (plain) (blame)
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
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();
}