summaryrefslogtreecommitdiff
path: root/aoc25/tools/download_input.zig
blob: 3fae78c00c9db64b5ae27b017c822a174858d991 (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
40
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();
}