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