//! Auto-generated by pugz.compileTemplates()
//! Do not edit manually - regenerate by running: zig build
const std = @import("std");
const Allocator = std.mem.Allocator;
const ArrayList = std.ArrayList(u8);
// ─────────────────────────────────────────────────────────────────────────────
// Helpers
// ─────────────────────────────────────────────────────────────────────────────
const esc_lut: [256]?[]const u8 = blk: {
var t: [256]?[]const u8 = .{null} ** 256;
t['&'] = "&";
t['<'] = "<";
t['>'] = ">";
t['"'] = """;
t['\''] = "'";
break :blk t;
};
fn esc(o: *ArrayList, a: Allocator, s: []const u8) Allocator.Error!void {
var i: usize = 0;
for (s, 0..) |c, j| {
if (esc_lut[c]) |e| {
if (j > i) try o.appendSlice(a, s[i..j]);
try o.appendSlice(a, e);
i = j + 1;
}
}
if (i < s.len) try o.appendSlice(a, s[i..]);
}
fn truthy(v: anytype) bool {
return switch (@typeInfo(@TypeOf(v))) {
.bool => v,
.optional => v != null,
.pointer => |p| if (p.size == .slice) v.len > 0 else true,
.int, .comptime_int => v != 0,
else => true,
};
}
var int_buf: [32]u8 = undefined;
fn strVal(v: anytype) []const u8 {
const T = @TypeOf(v);
switch (@typeInfo(T)) {
.pointer => |p| switch (p.size) {
.slice => return v,
.one => {
// For pointer-to-array, slice it
const child_info = @typeInfo(p.child);
if (child_info == .array) {
const arr_info = child_info.array;
const ptr: [*]const arr_info.child = @ptrCast(v);
return ptr[0..arr_info.len];
}
return strVal(v.*);
},
else => @compileError("unsupported pointer type"),
},
.array => @compileError("arrays must be passed by pointer"),
.int, .comptime_int => return std.fmt.bufPrint(&int_buf, "{d}", .{v}) catch "0",
.optional => return if (v) |val| strVal(val) else "",
else => @compileError("strVal: unsupported type " ++ @typeName(T)),
}
}
// ─────────────────────────────────────────────────────────────────────────────
// Templates
// ─────────────────────────────────────────────────────────────────────────────
pub fn simple_2(a: Allocator, d: anytype) Allocator.Error![]u8 {
var o: ArrayList = .empty;
try o.appendSlice(a, "
");
for (@field(d, "list")) |item| {
try o.appendSlice(a, "- ");
try esc(&o, a, strVal(item));
try o.appendSlice(a, "
");
}
try o.appendSlice(a, "
");
return o.items;
}
pub fn simple_1(a: Allocator, d: anytype) Allocator.Error![]u8 {
var o: ArrayList = .empty;
try o.appendSlice(a, "Hello ");
try esc(&o, a, strVal(@field(d, "name")));
try o.appendSlice(a, "!You have ");
try esc(&o, a, strVal(@field(d, "messageCount")));
try o.appendSlice(a, " messages!");
if (truthy(@field(d, "colors"))) {
try o.appendSlice(a, "
");
for (@field(d, "colors")) |color| {
try o.appendSlice(a, "- ");
try esc(&o, a, strVal(color));
try o.appendSlice(a, "
");
}
try o.appendSlice(a, "
");
} else {
try o.appendSlice(a, "
No colors!
");
}
try o.appendSlice(a, "
");
if (truthy(@field(d, "primary"))) {
try o.appendSlice(a, "
");
} else {
try o.appendSlice(a, "
");
}
try o.appendSlice(a, "
");
return o.items;
}
pub fn simple_0(a: Allocator, d: anytype) Allocator.Error![]u8 {
var o: ArrayList = .empty;
try o.appendSlice(a, "Hello, ");
try esc(&o, a, strVal(@field(d, "name")));
try o.appendSlice(a, "
");
return o.items;
}
pub fn projects_escaped(a: Allocator, d: anytype) Allocator.Error![]u8 {
var o: ArrayList = .empty;
try o.appendSlice(a, "");
try esc(&o, a, strVal(@field(d, "title")));
try o.appendSlice(a, "");
try esc(&o, a, strVal(@field(d, "text")));
try o.appendSlice(a, "
");
if (@field(d, "projects").len > 0) {
for (@field(d, "projects")) |project| {
try o.appendSlice(a, "");
try esc(&o, a, strVal(project.description));
try o.appendSlice(a, "
");
}
} else {
try o.appendSlice(a, "No projects
");
}
try o.appendSlice(a, "");
return o.items;
}
pub fn friends(a: Allocator, d: anytype) Allocator.Error![]u8 {
var o: ArrayList = .empty;
try o.appendSlice(a, "Friends");
for (@field(d, "friends")) |friend| {
try o.appendSlice(a, "
- Name: ");
try esc(&o, a, strVal(friend.name));
try o.appendSlice(a, "
- Balance: ");
try esc(&o, a, strVal(friend.balance));
try o.appendSlice(a, "
- Age: ");
try esc(&o, a, strVal(friend.age));
try o.appendSlice(a, "
- Address: ");
try esc(&o, a, strVal(friend.address));
try o.appendSlice(a, "
- Image:
;)
- Company: ");
try esc(&o, a, strVal(friend.company));
try o.appendSlice(a, "
- Email:
- About: ");
try esc(&o, a, strVal(friend.about));
try o.appendSlice(a, "
");
if (truthy(friend.tags)) {
try o.appendSlice(a, "- Tags:
");
for (if (@typeInfo(@TypeOf(friend.tags)) == .optional) (friend.tags orelse &.{}) else friend.tags) |tag| {
try o.appendSlice(a, "- ");
try esc(&o, a, strVal(tag));
try o.appendSlice(a, "
");
}
try o.appendSlice(a, "
");
}
if (truthy(friend.friends)) {
try o.appendSlice(a, "- Friends:
");
for (if (@typeInfo(@TypeOf(friend.friends)) == .optional) (friend.friends orelse &.{}) else friend.friends) |subFriend| {
try o.appendSlice(a, "- ");
try esc(&o, a, strVal(subFriend.name));
try o.appendSlice(a, " (");
try esc(&o, a, strVal(subFriend.id));
try o.appendSlice(a, ")
");
}
try o.appendSlice(a, "
");
}
try o.appendSlice(a, "
");
}
try o.appendSlice(a, "
");
return o.items;
}
pub fn search_results(a: Allocator, d: anytype) Allocator.Error![]u8 {
var o: ArrayList = .empty;
try o.appendSlice(a, "");
for (@field(d, "searchRecords")) |searchRecord| {
try o.appendSlice(a, "
");
try esc(&o, a, strVal(searchRecord.description));
if (truthy(searchRecord.featured)) {
try o.appendSlice(a, "
Featured!
");
}
if (truthy(searchRecord.sizes)) {
try o.appendSlice(a, "
Sizes available:
");
for (if (@typeInfo(@TypeOf(searchRecord.sizes)) == .optional) (searchRecord.sizes orelse &.{}) else searchRecord.sizes) |size| {
try o.appendSlice(a, "- ");
try esc(&o, a, strVal(size));
try o.appendSlice(a, "
");
}
try o.appendSlice(a, "
");
}
try o.appendSlice(a, "
");
}
try o.appendSlice(a, "
");
return o.items;
}
pub fn if_expression(a: Allocator, d: anytype) Allocator.Error![]u8 {
var o: ArrayList = .empty;
for (@field(d, "accounts")) |account| {
try o.appendSlice(a, "");
if (std.mem.eql(u8, strVal(account.status), "closed")) {
try o.appendSlice(a, "
Your account has been closed!
");
}
if (std.mem.eql(u8, strVal(account.status), "suspended")) {
try o.appendSlice(a, "
Your account has been temporarily suspended
");
}
if (std.mem.eql(u8, strVal(account.status), "open")) {
try o.appendSlice(a, "
Bank balance:");
if (truthy(account.negative)) {
try o.appendSlice(a, "");
try esc(&o, a, strVal(account.balanceFormatted));
try o.appendSlice(a, "");
} else {
try o.appendSlice(a, "");
try esc(&o, a, strVal(account.balanceFormatted));
try o.appendSlice(a, "");
}
try o.appendSlice(a, "
");
}
try o.appendSlice(a, "
");
}
return o.items;
}
pub const template_names = [_][]const u8{
"simple_2",
"simple_1",
"simple_0",
"projects_escaped",
"friends",
"search_results",
"if_expression",
};