From 29f477126492ad124b50d95a05c7c7b16f4f696d Mon Sep 17 00:00:00 2001 From: Bob Farrell Date: Sun, 3 Mar 2024 14:12:35 +0000 Subject: [PATCH] Upgrade Zmpl (latest version provides partials), fix mime map memory leak --- build.zig | 2 -- build.zig.zon | 4 ++-- demo/build.zig | 6 +----- demo/public/favicon.ico | Bin 0 -> 15406 bytes demo/src/app/views/root/_quotes.zmpl | 9 +++++++++ demo/src/app/views/root/index.zmpl | 11 ++--------- demo/src/main.zig | 6 +----- src/app/views/zmpl.manifest.zig | 5 ----- src/compile_static_routes.zig | 5 ++--- src/init/src/main.zig | 8 ++------ src/jetzig.zig | 25 ------------------------- src/jetzig/App.zig | 3 +-- src/jetzig/http/Server.zig | 26 ++++++++++++++------------ src/jetzig/http/mime.zig | 9 ++------- 14 files changed, 36 insertions(+), 83 deletions(-) create mode 100644 demo/public/favicon.ico create mode 100644 demo/src/app/views/root/_quotes.zmpl delete mode 100644 src/app/views/zmpl.manifest.zig diff --git a/build.zig b/build.zig index b714831..0902c8f 100644 --- a/build.zig +++ b/build.zig @@ -12,7 +12,6 @@ pub fn build(b: *std.Build) !void { const target = b.standardTargetOptions(.{}); const optimize = b.standardOptimizeOption(.{}); const template_path = b.option([]const u8, "zmpl_templates_path", "Path to templates") orelse "src/app/views/"; - const manifest: []const u8 = b.pathJoin(&.{ template_path, "zmpl.manifest.zig" }); const lib = b.addStaticLibrary(.{ .name = "jetzig", @@ -35,7 +34,6 @@ pub fn build(b: *std.Build) !void { .target = target, .optimize = optimize, .zmpl_templates_path = template_path, - .zmpl_manifest_path = manifest, }, ); diff --git a/build.zig.zon b/build.zig.zon index 440427b..6a6f26e 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -3,8 +3,8 @@ .version = "0.0.0", .dependencies = .{ .zmpl = .{ - .url = "https://github.com/jetzig-framework/zmpl/archive/84a712349e0cf679fc5c9900b805335d51d9ce86.tar.gz", - .hash = "1220e9f2133f6cd24c370850cbe3816e3d8b97c33dd822bf7eaf8f6f0ea2cfd2f8db", + .url = "https://github.com/jetzig-framework/zmpl/archive/aa7147f8a52d927dce6cdd4f5b3bb2de5080f28c.tar.gz", + .hash = "12203d262b39b2328adb981e41c5127507f3d47e977c1a4e69a96688a4213b986d04", }, }, diff --git a/demo/build.zig b/demo/build.zig index c0d560f..834f4ff 100644 --- a/demo/build.zig +++ b/demo/build.zig @@ -55,13 +55,9 @@ pub fn build(b: *std.Build) !void { lib.root_module.addImport("routes", routes_module); routes_module.addImport("jetzig", jetzig_module); - const templates_module = b.createModule( - .{ .root_source_file = .{ .path = "src/app/views/zmpl.manifest.zig" } }, - ); exe_static_routes.root_module.addImport("routes", routes_module); exe_static_routes.root_module.addImport("jetzig", jetzig_module); - exe_static_routes.root_module.addImport("templates", templates_module); - templates_module.addImport("zmpl", zmpl_module); + exe_static_routes.root_module.addImport("zmpl", zmpl_module); const run_static_routes_cmd = b.addRunArtifact(exe_static_routes); exe.step.dependOn(&run_static_routes_cmd.step); diff --git a/demo/public/favicon.ico b/demo/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..0ccc92bdf940b99f695dec79441bf65ae756c961 GIT binary patch literal 15406 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 YW#MJE`s{S5sRY9RBmZfE|MwR7KW0u{O8@`> literal 0 HcmV?d00001 diff --git a/demo/src/app/views/root/_quotes.zmpl b/demo/src/app/views/root/_quotes.zmpl new file mode 100644 index 0000000..ef479e8 --- /dev/null +++ b/demo/src/app/views/root/_quotes.zmpl @@ -0,0 +1,9 @@ +
+

{.message}

+
+ + + +
+
+
diff --git a/demo/src/app/views/root/index.zmpl b/demo/src/app/views/root/index.zmpl index 57ee5cc..5de793a 100644 --- a/demo/src/app/views/root/index.zmpl +++ b/demo/src/app/views/root/index.zmpl @@ -10,15 +10,8 @@
-
-

{.message}

-
- - - -
-
-
+ // Renders `src/app/views/root/_quotes.zmpl`: +
{^root/quotes}
diff --git a/demo/src/main.zig b/demo/src/main.zig index d5fcd2b..8159618 100644 --- a/demo/src/main.zig +++ b/demo/src/main.zig @@ -1,7 +1,6 @@ const std = @import("std"); pub const jetzig = @import("jetzig"); -pub const templates = @import("app/views/zmpl.manifest.zig").templates; pub const routes = @import("routes").routes; pub const jetzig_options = struct { @@ -16,8 +15,5 @@ pub fn main() !void { const app = try jetzig.init(allocator); defer app.deinit(); - try app.start( - comptime jetzig.route(routes), - comptime jetzig.loadTemplates(templates), - ); + try app.start(comptime jetzig.route(routes)); } diff --git a/src/app/views/zmpl.manifest.zig b/src/app/views/zmpl.manifest.zig deleted file mode 100644 index 3d67249..0000000 --- a/src/app/views/zmpl.manifest.zig +++ /dev/null @@ -1,5 +0,0 @@ -// Zmpl template manifest. -// This file is automatically generated at build time. Manual edits will be discarded. -// This file should _not_ be stored in version control. -pub const templates = struct { -}; diff --git a/src/compile_static_routes.zig b/src/compile_static_routes.zig index cf03fca..149306e 100644 --- a/src/compile_static_routes.zig +++ b/src/compile_static_routes.zig @@ -1,7 +1,7 @@ const std = @import("std"); const jetzig = @import("jetzig"); const routes = @import("routes").routes; -const templates = @import("templates").templates; +const zmpl = @import("zmpl"); pub fn main() !void { var gpa = std.heap.GeneralPurposeAllocator(.{}){}; @@ -94,8 +94,7 @@ fn writeContent( std.debug.print("[jetzig] Compiled static route: {s}\n", .{json_path}); - if (@hasDecl(templates, route.template)) { - const template = @field(templates, route.template); + if (zmpl.find(route.template)) |template| { const html_path = try std.mem.concat( allocator, u8, diff --git a/src/init/src/main.zig b/src/init/src/main.zig index 72b2899..a434403 100644 --- a/src/init/src/main.zig +++ b/src/init/src/main.zig @@ -1,8 +1,7 @@ const std = @import("std"); pub const jetzig = @import("jetzig"); -pub const templates = @import("app/views/zmpl.manifest.zig").templates; -pub const routes = @import("app/views/routes.zig").routes; +pub const routes = @import("routes").routes; pub fn main() !void { var gpa = std.heap.GeneralPurposeAllocator(.{}){}; @@ -12,8 +11,5 @@ pub fn main() !void { const app = try jetzig.init(allocator); defer app.deinit(); - try app.start( - comptime jetzig.route(routes), - comptime jetzig.loadTemplates(templates), - ); + try app.start(comptime jetzig.route(routes)); } diff --git a/src/jetzig.zig b/src/jetzig.zig index 48d8b94..22945eb 100644 --- a/src/jetzig.zig +++ b/src/jetzig.zig @@ -153,31 +153,6 @@ pub fn route(comptime routes: anytype) []views.Route { return &detected; } -// Receives a type (an imported module). All pub const declarations are considered as compiled -// Zmpl templates, each implementing a `render` function. -pub fn loadTemplates(comptime module: type) []TemplateFn { - var size: u16 = 0; - const decls = @typeInfo(module).Struct.decls; - - for (decls) |_| size += 1; - - var detected: [size]TemplateFn = undefined; - - for (decls, 0..) |decl, decl_index| { - detected[decl_index] = .{ - .render = @field(module, decl.name).render, - .name = decl.name, - }; - } - - return &detected; -} - -pub const TemplateFn = struct { - name: []const u8, - render: *const fn (*zmpl.Data) anyerror![]const u8, -}; - pub fn generateSecret(allocator: std.mem.Allocator) ![]const u8 { const chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; var secret: [64]u8 = undefined; diff --git a/src/jetzig/App.zig b/src/jetzig/App.zig index 8c2c645..96d3d15 100644 --- a/src/jetzig/App.zig +++ b/src/jetzig/App.zig @@ -18,7 +18,7 @@ pub fn deinit(self: Self) void { /// Starts an application. `routes` should be `@import("routes").routes`, a generated file /// automatically created at build time. `templates` should be /// `@import("src/app/views/zmpl.manifest.zig").templates`, created by Zmpl at compile time. -pub fn start(self: Self, comptime_routes: []jetzig.views.Route, templates: []jetzig.TemplateFn) !void { +pub fn start(self: Self, comptime_routes: []jetzig.views.Route) !void { var mime_map = jetzig.http.mime.MimeMap.init(self.allocator); defer mime_map.deinit(); try mime_map.build(); @@ -54,7 +54,6 @@ pub fn start(self: Self, comptime_routes: []jetzig.views.Route, templates: []jet self.port, self.server_options, routes.items, - templates, &mime_map, ); diff --git a/src/jetzig/http/Server.zig b/src/jetzig/http/Server.zig index 098a87d..feb0d39 100644 --- a/src/jetzig/http/Server.zig +++ b/src/jetzig/http/Server.zig @@ -1,6 +1,7 @@ const std = @import("std"); const jetzig = @import("../../jetzig.zig"); +const zmpl = @import("zmpl"); const root_file = @import("root"); @@ -24,7 +25,6 @@ logger: jetzig.loggers.Logger, options: ServerOptions, start_time: i128 = undefined, routes: []*jetzig.views.Route, -templates: []jetzig.TemplateFn, mime_map: *jetzig.http.mime.MimeMap, std_net_server: std.net.Server = undefined, @@ -36,7 +36,6 @@ pub fn init( port: u16, options: ServerOptions, routes: []*jetzig.views.Route, - templates: []jetzig.TemplateFn, mime_map: *jetzig.http.mime.MimeMap, ) Self { return .{ @@ -47,7 +46,6 @@ pub fn init( .logger = options.logger, .options = options, .routes = routes, - .templates = templates, .mime_map = mime_map, }; } @@ -123,7 +121,7 @@ fn renderResponse(self: *Self, request: *jetzig.http.Request) !void { const rendered = try self.renderInternalServerError(request, err); request.response.content = rendered.content; - request.response.status_code = .internal_server_error; + request.response.status_code = rendered.view.status_code; request.response.content_type = "text/html"; return; @@ -155,15 +153,19 @@ fn renderHTML( route: ?*jetzig.views.Route, ) !void { if (route) |matched_route| { - for (self.templates) |template| { - // TODO: Use a hashmap to avoid O(n) - if (std.mem.eql(u8, matched_route.template, template.name)) { - const rendered = try self.renderView(matched_route, request, template); - request.response.content = rendered.content; - request.response.status_code = rendered.view.status_code; + if (zmpl.find(matched_route.template)) |template| { + const rendered = self.renderView(matched_route, request, template) catch |err| { + if (isUnhandledError(err)) return err; + const rendered_error = try self.renderInternalServerError(request, err); + request.response.content = rendered_error.content; + request.response.status_code = rendered_error.view.status_code; request.response.content_type = "text/html"; return; - } + }; + request.response.content = rendered.content; + request.response.status_code = rendered.view.status_code; + request.response.content_type = "text/html"; + return; } } @@ -200,7 +202,7 @@ fn renderView( self: *Self, route: *jetzig.views.Route, request: *jetzig.http.Request, - template: ?jetzig.TemplateFn, + template: ?zmpl.manifest.Template, ) !RenderedView { const view = route.render(route.*, request) catch |err| { self.logger.debug("Encountered error: {s}", .{@errorName(err)}); diff --git a/src/jetzig/http/mime.zig b/src/jetzig/http/mime.zig index 10b8732..7ccac2d 100644 --- a/src/jetzig/http/mime.zig +++ b/src/jetzig/http/mime.zig @@ -31,19 +31,14 @@ pub const MimeMap = struct { } pub fn deinit(self: *MimeMap) void { - var it = self.map.iterator(); - while (it.next()) |item| { - self.allocator.free(item.key_ptr.*); - self.allocator.free(item.value_ptr.*); - } self.map.deinit(); } pub fn build(self: *MimeMap) !void { for (mime_types) |mime_type| { try self.map.put( - try self.allocator.dupe(u8, mime_type.file_type), - try self.allocator.dupe(u8, mime_type.name), + mime_type.file_type, + mime_type.name, ); } }