lib/zen/src/site/catalog/manifest.zig

daab053ee43316e1809a84551d573ddd1e5bf3d2

 1 const std = @import("std");
 2 
 3 const model = @import("model.zig");
 4 
 5 pub const path = ".zen/routes.json";
 6 pub const version: u32 = 1;
 7 
 8 pub fn write(catalog: model.Catalog, writer: *std.Io.Writer) std.Io.Writer.Error!void {
 9     try writer.writeAll("{\"version\":");
10     try std.json.Stringify.value(version, .{}, writer);
11     try writer.writeAll(",\"routes\":[");
12     for (catalog.pages, 0..) |entry, index| {
13         if (index != 0) try writer.writeByte(',');
14         try writer.writeAll("{\"route\":\"");
15         try writeStringChars(catalog.base, writer);
16         try writeStringChars(entry.url, writer);
17         try writer.writeAll("\",\"source\":");
18         try writeString(entry.relative_path, writer);
19         try writer.writeAll(",\"dispatch\":\"");
20         try writer.writeAll(@tagName(entry.dispatch));
21         try writer.writeAll("\",\"title\":");
22         try writeString(entry.title, writer);
23         try writer.writeAll(",\"draft\":");
24         try std.json.Stringify.value(entry.draft, .{}, writer);
25         try writer.writeAll(",\"slop\":");
26         try std.json.Stringify.value(entry.slop, .{}, writer);
27         try writer.writeByte('}');
28     }
29     try writer.writeAll("]}\n");
30 }
31 
32 pub fn encodedSize(catalog: model.Catalog) std.Io.Writer.Error!u64 {
33     var buffer: [256]u8 = undefined;
34     var discarding = std.Io.Writer.Discarding.init(&buffer);
35     try write(catalog, &discarding.writer);
36     return discarding.fullCount();
37 }
38 
39 fn writeString(value: []const u8, writer: *std.Io.Writer) std.Io.Writer.Error!void {
40     try writer.writeByte('"');
41     try writeStringChars(value, writer);
42     try writer.writeByte('"');
43 }
44 
45 fn writeStringChars(value: []const u8, writer: *std.Io.Writer) std.Io.Writer.Error!void {
46     try std.json.Stringify.encodeJsonStringChars(value, .{}, writer);
47 }