blob: 4a0a2b03cda35c72dca1b7e5e0987c61ed975cb7 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
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;
}
|