aboutsummaryrefslogtreecommitdiff
path: root/src/api
diff options
context:
space:
mode:
authorNathan Reiner <nathan@nathanreiner.xyz>2026-06-06 10:35:14 +0200
committerNathan Reiner <nathan@nathanreiner.xyz>2026-06-06 10:35:14 +0200
commit1d6e34388d9d792fd184c8b9e0fb11fb9b7e14f9 (patch)
tree2eaaf5077c604c79a359037c772f99bb83839545 /src/api
parentf39dfd01ab06cf92a3bcad75fcb175a8242ec1b1 (diff)
api: add example implementations
Diffstat (limited to 'src/api')
-rw-r--r--src/api/hello-body.zig20
-rw-r--r--src/api/hello-json.zig15
-rw-r--r--src/api/hello-param.zig14
-rw-r--r--src/api/root.zig17
4 files changed, 65 insertions, 1 deletions
diff --git a/src/api/hello-body.zig b/src/api/hello-body.zig
new file mode 100644
index 0000000..2e5a09e
--- /dev/null
+++ b/src/api/hello-body.zig
@@ -0,0 +1,20 @@
+const http = @import("http");
+const Context = http.handler.Context;
+const Response = http.Response;
+
+const Ctx = Context(.{"hello-body"});
+pub const ctx: Ctx = .{
+ .post = post,
+};
+
+const Body = struct {
+ value: usize,
+};
+
+fn post(request: Ctx.Request) Response {
+ const body = request.json(Body) catch return .bad_request(.void);
+
+ return .ok_or_error(.json(request.arena, .{
+ .value = body.value,
+ }));
+}
diff --git a/src/api/hello-json.zig b/src/api/hello-json.zig
new file mode 100644
index 0000000..7c96c29
--- /dev/null
+++ b/src/api/hello-json.zig
@@ -0,0 +1,15 @@
+const http = @import("http");
+const Context = http.handler.Context;
+const Response = http.Response;
+
+const Ctx = Context(.{ "hello-json" });
+pub const ctx: Ctx = .{
+ .get = get,
+};
+
+fn get(request: Ctx.Request) Response {
+ return .ok_or_error(.json(request.arena, .{
+ .value = 42,
+ .message = "Hello, Json!",
+ }));
+}
diff --git a/src/api/hello-param.zig b/src/api/hello-param.zig
new file mode 100644
index 0000000..ba798af
--- /dev/null
+++ b/src/api/hello-param.zig
@@ -0,0 +1,14 @@
+const http = @import("http");
+const Context = http.handler.Context;
+const Response = http.Response;
+
+const Ctx = Context(.{ "hello-param", .value });
+pub const ctx: Ctx = .{
+ .get = get,
+};
+
+fn get(request: Ctx.Request) Response {
+ const value = request.params.value.as(usize) catch return .bad_request(.string("parameter needs to be an int"));
+
+ return .ok_or_error(.json(request.arena, .{ .value = value, }));
+}
diff --git a/src/api/root.zig b/src/api/root.zig
index 7acd953..7570a76 100644
--- a/src/api/root.zig
+++ b/src/api/root.zig
@@ -6,7 +6,22 @@ const std = @import("std");
const http = @import("http");
const Interface = http.handler.Interface;
-pub const interfaces: []const Interface = &.{};
+const modules = .{
+ @import("hello-json.zig"),
+ @import("hello-param.zig"),
+ @import("hello-body.zig"),
+};
+
+pub const interfaces: []const Interface = ifs: {
+ var ifs: []const Interface = &.{};
+
+ for (modules) |module| {
+ const interface: []const Interface = &.{ module.ctx.interface() };
+ ifs = ifs ++ interface;
+ }
+
+ break :ifs ifs;
+};
test {
_ = std.testing.refAllDecls(@This());