aboutsummaryrefslogtreecommitdiff
path: root/src/config.zig
blob: 02d3c8aed4bb65338dc025005567d0dd1aa24cc2 (plain)
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;
}