const std = @import("std"); const Self = @This(); const Config = struct { storage_path: []const u8, session_expires_after: usize, }; arena: *std.heap.ArenaAllocator, storage_path: []const u8, session_expires_after: usize, pub fn load(allocator: std.mem.Allocator) !Self { const home_path = std.posix.getenv("HOME") orelse return error.MissingHome; const home = try std.fs.cwd().openDirZ( home_path, .{}, ); const file = home.openFile( ".config/memora/config.json", .{} ) catch return error.MissingConfig; const content = try file.readToEndAlloc(allocator, std.math.maxInt(usize)); defer allocator.free(content); const parsed = try std.json.parseFromSlice(Config, allocator, content, .{ .allocate = .alloc_always, }); return .{ .arena = parsed.arena, .storage_path = parsed.value.storage_path, .session_expires_after = parsed.value.session_expires_after * std.time.ns_per_day, }; } pub fn deinit(self: *Self) void { self.arena.deinit(); self.* = undefined; }