diff --git a/src/env.zig b/src/env.zig new file mode 100644 index 0000000..73854dd --- /dev/null +++ b/src/env.zig @@ -0,0 +1,45 @@ +const std = @import("std"); + +pub const Env = struct { + data_dir: []const u8, + pub fn init(allocator: std.mem.Allocator, env_map: *const std.process.Environ.Map) !Env { + const data_dir = if (env_map.get("XDG_DATA_HOME")) |xdg_data_home| + try std.fmt.allocPrint(allocator, "{s}/zos", .{xdg_data_home}) + else blk: { + const home = env_map.get("HOME").?; + break :blk try std.fmt.allocPrint( + allocator, + "{s}/.local/share/zos", + .{home}, + ); + }; + return .{ .data_dir = data_dir }; + } + + pub fn deinit(env: Env, allocator: std.mem.Allocator) void { + allocator.free(env.data_dir); + } +}; + +test "Validate that missing xdg data dir is default" { + const allocator = std.testing.allocator; + var env_map = std.process.Environ.Map.init(allocator); + defer env_map.deinit(); + + try env_map.put("HOME", "/home/aselimov"); + const env: Env = try .init(allocator, &env_map); + defer env.deinit(allocator); + std.debug.print("{s}", .{env.data_dir}); + try std.testing.expect(std.mem.eql(u8, env.data_dir, "/home/aselimov/.local/share/zos")); +} + +test "Validate that xdg data dir sets data dir" { + const allocator = std.testing.allocator; + var env_map = std.process.Environ.Map.init(allocator); + try env_map.put("XDG_DATA_HOME", "/home/aselimov/share"); + defer env_map.deinit(); + + const env: Env = try .init(allocator, &env_map); + defer env.deinit(allocator); + try std.testing.expect(std.mem.eql(u8, env.data_dir, "/home/aselimov/share/zos")); +} diff --git a/src/notes/model.zig b/src/notes/model.zig new file mode 100644 index 0000000..0bd3889 --- /dev/null +++ b/src/notes/model.zig @@ -0,0 +1,25 @@ +const std = @import("std"); +const Note = @This(); + +name: []const u8, +tags: []const []const u8, +path: []const u8, + +pub fn init() Note { + return .{ .name = "", .tags = .empty, .path = "" }; +} + +test "Parse from json" { + const allocator = std.testing.allocator; + const json_string = "{\"name\": \"test\", \"tags\":[\"tag1\", \"tag2\"], \"path\":\"/path/to/test\"}"; + + const result = try std.json.parseFromSlice(Note, allocator, json_string, .{}); + defer result.deinit(); + + const expect = std.testing.expect; + + try expect(std.mem.eql(u8, "test", result.value.name)); + try expect(std.mem.eql(u8, "tag1", result.value.tags[0])); + try expect(std.mem.eql(u8, "tag2", result.value.tags[1])); + try expect(std.mem.eql(u8, "/path/to/test", result.value.path)); +}