aboutsummaryrefslogtreecommitdiff
path: root/src/http/Url.zig
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;
}