diff options
| author | Nathan Reiner <nathan@nathanreiner.xyz> | 2026-06-05 19:28:56 +0200 |
|---|---|---|
| committer | Nathan Reiner <nathan@nathanreiner.xyz> | 2026-06-05 19:28:56 +0200 |
| commit | 8001b02547ba6261682a6d6990157293b23e18d7 (patch) | |
| tree | ee0f7c130a0319e47a677ae24ac66765014507f1 /src/http/Route.zig | |
| parent | 44051e51f99fe7e94f37d567d621fa13399c17f1 (diff) | |
http add request and context
Diffstat (limited to 'src/http/Route.zig')
| -rw-r--r-- | src/http/Route.zig | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/http/Route.zig b/src/http/Route.zig new file mode 100644 index 0000000..bc86544 --- /dev/null +++ b/src/http/Route.zig @@ -0,0 +1,45 @@ +const std = @import("std"); + +pub const Segment = union(enum) { + literal: []const u8, + identifier: []const u8, + + pub fn format(self: *const @This(), writer: *std.Io.Writer) !void { + switch (self.*) { + .literal => |l| try writer.print("{s}", .{l}), + .identifier => |l| try writer.print("{{{s}}}", .{l}), + } + } +}; + +segments: []const Segment, + +pub fn fromAny(comptime route: anytype) @This() { + var segments: []const Segment = &.{}; + + inline for(route) |r| { + const segment: []const Segment = &.{ switch (@TypeOf(r)) { + @EnumLiteral() => .{ .identifier = @tagName(r) }, + else => .{ .literal = r }, + } }; + + segments = segments ++ segment; + } + + return .{ .segments = segments }; +} + +pub fn format(self: *const @This(), writer: *std.Io.Writer) !void { + for (self.segments) |*seg| { + try writer.print("/{f}", .{seg}); + } +} + + +pub fn shift(self: *const @This()) struct { Segment, @This() } { + if (self.segments.len == 0) { + @compileError("shift on empty route"); + } + + return .{ self.segments[0], self.segments[1..] }; +} |