lib/zen/src/frontmatter/model.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2
3 pub const Pair = struct {
4 key: []const u8,
5 value: []const u8,
6 };
7
8 pub const Metadata = struct {
9 pairs: []const Pair = &.{},
10
11 pub fn get(self: Metadata, key: []const u8) ?[]const u8 {
12 for (self.pairs) |pair| {
13 if (std.mem.eql(u8, pair.key, key)) return pair.value;
14 }
15 return null;
16 }
17
18 pub fn title(self: Metadata) ?[]const u8 {
19 return self.get("title");
20 }
21
22 pub fn description(self: Metadata) ?[]const u8 {
23 return self.get("description");
24 }
25
26 pub fn date(self: Metadata) ?[]const u8 {
27 return self.get("date");
28 }
29
30 pub fn draft(self: Metadata) bool {
31 const value = self.get("draft") orelse return false;
32 return std.mem.eql(u8, value, "true");
33 }
34
35 pub fn curated(self: Metadata) bool {
36 const value = self.get("curated") orelse return false;
37 return std.mem.eql(u8, value, "true");
38 }
39 };
40
41 pub const Parsed = struct {
42 metadata: Metadata = .{},
43 body: []const u8,
44 };
45
46 pub const ParseError = error{
47 UnclosedFrontmatter,
48 };
49
50 pub const Exhaustion = error{
51 PairCapacityExceeded,
52 ContinuationByteCapacityExceeded,
53 FrontmatterStorageInUse,
54 };
55
56 pub const Error = ParseError || Exhaustion || error{CapacityOverflow};