3fa90a0b
Gregory Mullen
# Verse
3fa90a0b
Gregory Mullen
3fa90a0b
Gregory Mullen
A comfortable and powerful web framework, where your Zig code looks like Zig
3fa90a0b
Gregory Mullen
3fa90a0b
Gregory Mullen
```zig
3fa90a0b
Gregory Mullen
const IndexHtml = Page("index.html");
3fa90a0b
Gregory Mullen
3fa90a0b
Gregory Mullen
fn index(frame: *Frame) !void {
3fa90a0b
Gregory Mullen
const greeting = try allocPrint(frame.alloc, "Hi, {s}!", .{"Mom"});
3fa90a0b
Gregory Mullen
defer frame.alloc.free(greeting);
3fa90a0b
Gregory Mullen
3fa90a0b
Gregory Mullen
var page = IndexHtml.init(.{
3fa90a0b
Gregory Mullen
// .main_title = "TODO add better title!",
3fa90a0b
Gregory Mullen
.message = greeting,
3fa90a0b
Gregory Mullen
.features = &[_].{
3fa90a0b
Gregory Mullen
.{ .feature = "good" },
3fa90a0b
Gregory Mullen
.{ .feature = "fast" },
3fa90a0b
Gregory Mullen
.{ .feature = "simple" },
3fa90a0b
Gregory Mullen
},
3fa90a0b
Gregory Mullen
.reason = .{ .inner_text = "Template generated at comptime" },
3fa90a0b
Gregory Mullen
});
3fa90a0b
Gregory Mullen
try frame.sendPage(&page);
3fa90a0b
Gregory Mullen
}
3fa90a0b
Gregory Mullen
88f01a5c
Gregory Mullen
const routes = Routes(&[_]Match{
3fa90a0b
Gregory Mullen
GET("index.html", index),
88f01a5c
Gregory Mullen
});
3fa90a0b
Gregory Mullen
3fa90a0b
Gregory Mullen
pub fn main() !void {
88f01a5c
Gregory Mullen
var srv = Server.init(default_allocator, routes, .{ .mode = .{ .zwsgi = .{} });
3fa90a0b
Gregory Mullen
srv.serve() catch |err| switch (err) {
3fa90a0b
Gregory Mullen
else => std.debug.print("Server Error: {}\n", .{err});
3fa90a0b
Gregory Mullen
};
3fa90a0b
Gregory Mullen
}
3fa90a0b
Gregory Mullen
```
3fa90a0b
Gregory Mullen
3fa90a0b
Gregory Mullen
and your HTML, looks like HTML
3fa90a0b
Gregory Mullen
3fa90a0b
Gregory Mullen
```html
3fa90a0b
Gregory Mullen
<!DOCTYPE html>
3fa90a0b
Gregory Mullen
<html>
3fa90a0b
Gregory Mullen
<head>
3fa90a0b
Gregory Mullen
<title>
3fa90a0b
Gregory Mullen
<MainTitle default="Verse Template" />
3fa90a0b
Gregory Mullen
</title>
3fa90a0b
Gregory Mullen
</head>
3fa90a0b
Gregory Mullen
<body>
3fa90a0b
Gregory Mullen
<p><Message /></p>
3fa90a0b
Gregory Mullen
<ul>
3fa90a0b
Gregory Mullen
<For Features>
3fa90a0b
Gregory Mullen
<li><Feature /></li>
3fa90a0b
Gregory Mullen
</For>
3fa90a0b
Gregory Mullen
<With Reason>
3fa90a0b
Gregory Mullen
<p><InnerText /></p>
3fa90a0b
Gregory Mullen
</With>
3fa90a0b
Gregory Mullen
</body>
3fa90a0b
Gregory Mullen
</html>
3fa90a0b
Gregory Mullen
```
0ded6d90
Gregory Mullen
0ded6d90
Gregory Mullen
## Features
0ded6d90
Gregory Mullen
* uWSGI Protocol
0ded6d90
Gregory Mullen
* HTTP
0ded6d90
Gregory Mullen
* Compiles complete site to a completely self contained binary
0ded6d90
Gregory Mullen
* Built in comptime Template library
0ded6d90
Gregory Mullen
* Zero dependencies
0ded6d90
Gregory Mullen
0ded6d90
Gregory Mullen
0ded6d90
Gregory Mullen
## Goals
0ded6d90
Gregory Mullen
* Write Software You Can Love
0ded6d90
Gregory Mullen
* Follow the Zig Zen
0ded6d90
Gregory Mullen
0ded6d90
Gregory Mullen
## How do I ...
0ded6d90
Gregory Mullen
There are a number of [demos/sites in examples/](examples/) that can get you
0ded6d90
Gregory Mullen
started quickly. But there are a number of intentionally omitted features. Most
0ded6d90
Gregory Mullen
notably is any middleware API. Verse follows Zig Zen and has no hidden control
0ded6d90
Gregory Mullen
flow. All middleware patterns break this rule. Even without it, Verse still
0ded6d90
Gregory Mullen
**does** support all the important "pre-flight" or request setup steps. If your
0ded6d90
Gregory Mullen
application needs a more complex request setup step, you can use a custom
0ded6d90
Gregory Mullen
response builder. That builder has full control over both the request frame, and
0ded6d90
Gregory Mullen
the call to the endpoint. If you absolutely need to inspect, or alter the
0ded6d90
Gregory Mullen
response before it's returned to the client, and understand the downsides of
0ded6d90
Gregory Mullen
doing so, You could implement your own middleware by replacing the `Frame`
0ded6d90
Gregory Mullen
downstream writer with a local buffer, The called endpoint would write to that
0ded6d90
Gregory Mullen
buffer.
0ded6d90
Gregory Mullen
0ded6d90
Gregory Mullen