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 }