srctree

README.md
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