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