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");
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;
}
|