aboutsummaryrefslogtreecommitdiff
path: root/src/config.zig
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2025-11-24 17:43:49 +0100
committerNathan Reiner <nathan@nathanreiner.xyz>2025-11-24 17:43:49 +0100
commitf2cd03729059206fe584e2a9f278dd67625a9221 (patch)
tree6dbe280f0b8f24e32e81c7ff96dd5f1ccc63909e /src/config.zig
parentb2323081234b8635681062d7737daabd7ab837a9 (diff)
add config
Diffstat (limited to 'src/config.zig')
-rw-r--r--src/config.zig41
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;
+}