lib/zen/src/footnote/model.zig
daab053ee43316e1809a84551d573ddd1e5bf3d2
1 const std = @import("std");
2
3 pub const Definition = struct {
4 key: []const u8,
5 text: []const u8,
6 number: usize = 0,
7 references: usize = 0,
8 active: bool = true,
9 };
10
11 pub const Mark = struct {
12 number: usize,
13 reference: usize,
14 };
15
16 pub const Set = struct {
17 definitions: []Definition,
18 next_number: usize = 1,
19
20 pub fn markFor(self: *Set, key: []const u8) ?Mark {
21 const index = self.findIndex(key) orelse return null;
22 const definition = &self.definitions[index];
23 if (definition.number == 0) {
24 definition.number = self.next_number;
25 self.next_number += 1;
26 }
27 definition.references += 1;
28 return .{
29 .number = definition.number,
30 .reference = definition.references,
31 };
32 }
33
34 pub fn hasReferences(self: Set) bool {
35 for (self.definitions) |definition| {
36 if (definition.active and definition.references != 0) return true;
37 }
38 return false;
39 }
40
41 pub fn findIndex(self: Set, key: []const u8) ?usize {
42 for (self.definitions, 0..) |definition, index| {
43 if (definition.active and std.mem.eql(u8, definition.key, key)) return index;
44 }
45 return null;
46 }
47 };
48
49 pub const Exhaustion = error{
50 FootnoteDefinitionCapacityExceeded,
51 FootnoteJoinedTextByteCapacityExceeded,
52 FootnoteStorageInUse,
53 };
54
55 pub const Error = Exhaustion || error{CapacityOverflow};