Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/cloudef/zig-router
Straightforward HTTP-like request routing.
https://github.com/cloudef/zig-router
backend http routing web-framework zig
Last synced: about 2 months ago
JSON representation
Straightforward HTTP-like request routing.
- Host: GitHub
- URL: https://github.com/cloudef/zig-router
- Owner: Cloudef
- License: mit
- Created: 2023-12-20T16:17:51.000Z (about 1 year ago)
- Default Branch: master
- Last Pushed: 2024-07-23T01:17:03.000Z (5 months ago)
- Last Synced: 2024-10-11T10:25:01.440Z (2 months ago)
- Topics: backend, http, routing, web-framework, zig
- Language: Zig
- Homepage:
- Size: 55.7 KB
- Stars: 22
- Watchers: 4
- Forks: 1
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- Funding: .github/FUNDING.yml
- License: LICENSE
Awesome Lists containing this project
README
# zig-router
Straightforward HTTP-like request routing.
---
Project is tested against zig 0.14.0-dev.23+d9bd34fd0
## Sample
```zig
const router = @import("zig-router");const MyJsonBody = struct {
float: f32,
text: []const u8,
number_with_default: u32 = 42,
};fn putJson(body: MyJsonBody) !Response {
log.info("float: {}", .{body.float});
log.info("text: {s}", .{body.text});
log.info("number_with_default: {}", .{body.number_with_default});
return .{ .body = "ok" };
}const MyPathParams = struct {
id: []const u8,
bundle: u32,
};fn getDynamic(params: MyPathParams) !Response {
log.info("id: {s}", .{params.id});
log.info("bundle: {}", .{params.bundle});
return .{};
}const MyQuery = struct {
id: []const u8 = "plz give me a good paying stable job",
bundle: u32 = 42,
};fn getQuery(query: MyQuery) !Response {
log.info("id: {s}", .{query.id});
log.info("bundle: {}", .{query.bundle});
return .{};
}fn getError() !void {
return error.EPIC_FAIL;
}fn onRequest(arena: *std.heap.ArenaAllocator, request: Request) !void {
router.Router(.{
router.Decoder(.json, router.JsonBodyDecoder(.{}, 4096).decode),
}, .{
router.Route(.PUT, "/json", putJson, .{}),
router.Route(.GET, "/dynamic/:id/paths/:bundle", getDynamic, .{}),
router.Route(.GET, "/query", getQuery, .{}),
router.Route(.GET, "/error", getError, .{}),
}).match(arena.allocator(), .{
.method = request.method,
.path = request.path,
.query = request.query,
.body = .{ .reader = request.body.reader() }
}, .{ arena.allocator() }) catch |err| switch (err) {
error.not_found => return .{ .status = .not_found },
error.bad_request => return .{ .status = .bad_request },
else => return err,
};
}
```## Depend
Run the following command in zig project root directory.
```sh
zig fetch --save git+https://github.com/Cloudef/zig-router.git
```In `build.zig` file add the following for whichever modules `zig-router` is required.
```zig
const zig_router = b.dependency("zig-router", .{});
exe.root_module.addImport("zig-router", zig_router.module("zig-router"));
```You can now import the `zig-router` from zig code.
```zig
const router = @import("zig-router");
```