-
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
-
42
// Copyright 2026 Shota FUJI
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
//
// SPDX-License-Identifier: MPL-2.0
const Options = @This();
const std = @import("std");
const config = @import("config");
app_dir: std.Io.Dir,
pub const InitError = std.Io.Dir.OpenError;
pub fn init(io: std.Io, environ_map: *const std.process.Environ.Map) InitError!Options {
const app_dir = app_dir: {
if (config.dir_env) |dir_env| {
if (environ_map.get(dir_env)) |path| {
const base = try std.Io.Dir.cwd().openDir(io, path, .{});
defer base.close(io);
errdefer std.log.info("App directory = {s}/timetracker", .{path});
break :app_dir try base.openDir(io, "timetracker", .{});
}
}
errdefer std.log.info("App directory = $PWD/.timetracker", .{});
break :app_dir try std.Io.Dir.cwd().openDir(io, ".timetracker", .{});
};
return .{
.app_dir = app_dir,
};
}
pub fn deinit(self: Options, io: std.Io) void {
self.app_dir.close(io);
}