Zinatra is an HTTP server framework based on Zig's std.http.Server
, with a
familiar high-level API.
const std = @import("std");
const zin = @import("zinatra");
// zin.Handler functions accept a *Context and return !void
fn greet(ctx: *zin.Context) !void {
// params can be accessed via the built-in map
const name = ctx.params.get("name").?;
// each context creates an arena allocator, so you can make quick
// per-request allocations without calling free
const msg = try std.fmt.allocPrint(ctx.allocator(), "Hello, {s}!", .{name});
// Context helper methods for common response types
try ctx.text(msg);
}
// zin.Context provides shortcuts for common cases, like sending JSON
fn sendJson(ctx: *zin.Context) !void {
try ctx.json(.{
.foo = "bar",
});
}
// Middleware functions have the same function signature as route handlers
fn defaultHeaders(ctx: *zin.Context) !void {
try ctx.headers.append(.{ .name = "server", .value = "zin/v0.1.0" });
}
pub fn main() !void {
var app = try zin.App.init(.{
.allocator = std.heap.page_allocator,
});
defer app.deinit();
// optionally add query string parameters to route parameters map
try app.use(zin.mw.queryStringParser);
try app.use(defaultHeaders);
// use classic route templating syntax to register handlers
try app.get("/greet/:name", greet);
try app.get("/json", sendJson);
try app.listen();
}
Check out the examples folder for more functionality.
Perhaps your next "microservice" at work could be in Zig! Think about it...