const std = @import("std"); const Segment = union(enum) { literal: []const u8, parameter: []const u8, pub fn format(self: @This(), writer: *std.Io.Writer) !void { try writer.print("{s}{{ {s} }}", .{ @tagName(self), switch (self) { inline else => |s| s, } }); } }; pub fn Template(comptime template: []const u8) []const Segment { var segments: []const Segment = &.{}; var t = template; if (template.len == 0 or template[0] != '/') { @compileError("template needs to be absolute"); } while (t.len > 0) { const index = std.mem.indexOfScalar(u8, t, '/'); const segment = t[0 .. index orelse t.len]; t = t[(index orelse t.len - 1) + 1 ..]; if (segment.len > 0) { const s: []const Segment = &.{seg: { if (segment[0] == '{' and segment[segment.len - 1] == '}') { break :seg .{ .parameter = segment[1 .. segment.len - 1] }; } else { break :seg .{ .literal = segment }; } }}; segments = segments ++ s; } } return segments; }