diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2025-11-24 17:43:49 +0100 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2025-11-24 17:43:49 +0100 |
| commit | f2cd03729059206fe584e2a9f278dd67625a9221 (patch) | |
| tree | 6dbe280f0b8f24e32e81c7ff96dd5f1ccc63909e /src/config.zig | |
| parent | b2323081234b8635681062d7737daabd7ab837a9 (diff) | |
add config
Diffstat (limited to 'src/config.zig')
| -rw-r--r-- | src/config.zig | 41 |
1 files changed, 39 insertions, 2 deletions
diff --git a/src/config.zig b/src/config.zig index 687cd25..02d3c8a 100644 --- a/src/config.zig +++ b/src/config.zig @@ -1,4 +1,41 @@ const std = @import("std"); -pub const storage_path = "./storage/"; -pub const session_expires_after = std.time.ns_per_week * 4; +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; +} |