const std = @import("std"); pub const Setup = struct { pub const Part = enum { pt1, pt2 }; gpa: std.heap.GeneralPurposeAllocator(.{}), a: std.mem.Allocator, input: []const u8, part: Part, pub fn get() !Setup { var res: Setup = undefined; res.gpa = std.heap.GeneralPurposeAllocator(.{}){}; res.a = res.gpa.allocator(); var p = std.process.args(); var file: []const u8 = ""; if (!p.skip()) return error.NoProgramName; if (p.next()) |pp| { if (std.mem.eql(u8, pp, "pt1")) { res.part = .pt1; } else if (std.mem.eql(u8, pp, "pt2")) { res.part = .pt2; } else { return error.BadPartSpecified; } } else { return error.NoPartSpecified; } if (p.next()) |pp| { file = pp; } else { return error.NoPartSpecified; } var f = try std.fs.cwd().openFile(file, .{}); defer f.close(); var c = try f.readToEndAlloc(res.a, std.math.maxInt(u32)); res.input = c; return res; } pub fn deinit(self: *Setup) void { _ = self; //self.a.free(self.input); // For some reason this is freezing //_ = self.gpa.deinit(); // and if we don't free, then gpa.deinit whinges that we leaked memory :) } };