From 55f7bebb9ef20864a5200c33e68c46abaecd19cb Mon Sep 17 00:00:00 2001 From: Bob Farrell Date: Sun, 15 Sep 2024 17:08:26 +0100 Subject: [PATCH] WIP --- build.zig.zon | 3 +-- src/Routes.zig | 3 ++- src/commands/routes.zig | 4 ++++ src/jetzig/database.zig | 3 +++ src/jetzig/http/Request.zig | 3 +++ src/jetzig/views/Route.zig | 8 +++++++- 6 files changed, 20 insertions(+), 4 deletions(-) diff --git a/build.zig.zon b/build.zig.zon index ea768b6..5380ac9 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -7,8 +7,7 @@ .hash = "1220d0e8734628fd910a73146e804d10a3269e3e7d065de6bb0e3e88d5ba234eb163", }, .zmpl = .{ - .url = "https://github.com/jetzig-framework/zmpl/archive/dc4c5d2e224ce61990a9593681ee7ffb8c2ca8c2.tar.gz", - .hash = "1220175cf7aa82cc18c787e29ec2f62d17b55a5d0d280dfd15ffa347d3932beb9bdc", + .path = "../zmpl", }, .jetkv = .{ .url = "https://github.com/jetzig-framework/jetkv/archive/2b1130a48979ea2871c8cf6ca89c38b1e7062839.tar.gz", diff --git a/src/Routes.zig b/src/Routes.zig index 7863f20..b46d833 100644 --- a/src/Routes.zig +++ b/src/Routes.zig @@ -55,7 +55,8 @@ const Function = struct { const path = relative_path[0 .. relative_path.len - std.fs.path.extension(relative_path).len]; if (std.mem.eql(u8, path, "root")) return try self.routes.allocator.dupe(u8, "/"); - return try std.mem.concat(self.routes.allocator, u8, &[_][]const u8{ "/", path }); + const maybe_new = if (std.mem.eql(u8, self.name, "new")) "/new" else ""; + return try std.mem.concat(self.routes.allocator, u8, &[_][]const u8{ "/", path, maybe_new }); } pub fn lessThanFn(context: void, lhs: Function, rhs: Function) bool { diff --git a/src/commands/routes.zig b/src/commands/routes.zig index 58f8406..97e24a8 100644 --- a/src/commands/routes.zig +++ b/src/commands/routes.zig @@ -3,6 +3,8 @@ const routes = @import("routes"); const app = @import("app"); const jetzig = @import("jetzig"); +pub const jetzig_options = app.jetzig_options; + pub fn main() !void { var gpa = std.heap.GeneralPurposeAllocator(.{}){}; const allocator = gpa.allocator(); @@ -21,6 +23,7 @@ pub fn main() !void { const action = comptime switch (route.action) { .get => jetzig.colors.cyan("{s: <7}"), .index => jetzig.colors.blue("{s: <7}"), + .new => jetzig.colors.green("{s: <7}"), .post => jetzig.colors.yellow("{s: <7}"), .put => jetzig.colors.magenta("{s: <7}"), .patch => jetzig.colors.bright_magenta("{s: <7}"), @@ -32,6 +35,7 @@ pub fn main() !void { @tagName(route.action), route.uri_path ++ switch (route.action) { .index, .post => "", + .new => "/new", .get, .put, .patch, .delete => "/:id", .custom => "", }, diff --git a/src/jetzig/database.zig b/src/jetzig/database.zig index 30b9908..0a76b06 100644 --- a/src/jetzig/database.zig +++ b/src/jetzig/database.zig @@ -50,4 +50,7 @@ pub fn repo(allocator: std.mem.Allocator, maybe_options: ?DatabaseOptions, app: fn eventCallback(event: jetzig.jetquery.events.Event, app: *const jetzig.App) !void { try app.server.logger.INFO("[database] {?s}", .{event.sql}); + if (event.err) |err| { + try app.server.logger.ERROR("[database] {?s}", .{err.message}); + } } diff --git a/src/jetzig/http/Request.zig b/src/jetzig/http/Request.zig index a0498a6..60f5868 100644 --- a/src/jetzig/http/Request.zig +++ b/src/jetzig/http/Request.zig @@ -632,6 +632,7 @@ pub fn match(self: *Request, route: jetzig.views.Route) !bool { .GET => switch (route.action) { .index => self.isMatch(.exact, route), .get => self.isMatch(.resource_id, route), + .new => self.isMatch(.exact, route), else => false, }, .POST => switch (route.action) { @@ -660,5 +661,7 @@ fn isMatch(self: *Request, match_type: enum { exact, resource_id }, route: jetzi .resource_id => self.path.directory, }; + if (route.action == .get and std.mem.eql(u8, self.path.resource_id, "new")) return false; + return std.mem.eql(u8, path, route.uri_path); } diff --git a/src/jetzig/views/Route.zig b/src/jetzig/views/Route.zig index bb2f4dd..2ed4104 100644 --- a/src/jetzig/views/Route.zig +++ b/src/jetzig/views/Route.zig @@ -4,7 +4,7 @@ const jetzig = @import("../../jetzig.zig"); const Route = @This(); -pub const Action = enum { index, get, post, put, patch, delete, custom }; +pub const Action = enum { index, get, new, post, put, patch, delete, custom }; pub const RenderFn = *const fn (Route, *jetzig.http.Request) anyerror!jetzig.views.View; pub const RenderStaticFn = *const fn (Route, *jetzig.http.StaticRequest) anyerror!jetzig.views.View; @@ -17,6 +17,7 @@ const StaticViewWithId = *const fn (id: []const u8, *jetzig.http.StaticRequest, pub const Formats = struct { index: ?[]const ResponseFormat = null, get: ?[]const ResponseFormat = null, + new: ?[]const ResponseFormat = null, post: ?[]const ResponseFormat = null, put: ?[]const ResponseFormat = null, patch: ?[]const ResponseFormat = null, @@ -28,6 +29,7 @@ const ResponseFormat = enum { html, json }; pub const DynamicViewType = union(Action) { index: ViewWithoutId, get: ViewWithId, + new: ViewWithoutId, post: ViewWithoutId, put: ViewWithId, patch: ViewWithId, @@ -38,6 +40,7 @@ pub const DynamicViewType = union(Action) { pub const StaticViewType = union(Action) { index: StaticViewWithoutId, get: StaticViewWithId, + new: StaticViewWithoutId, post: StaticViewWithoutId, put: StaticViewWithId, patch: StaticViewWithId, @@ -120,6 +123,7 @@ pub fn validateFormat(self: Route, request: *const jetzig.http.Request) bool { const supported_formats = switch (self.action) { .index => formats.index orelse return true, .get => formats.get orelse return true, + .new => formats.new orelse return true, .post => formats.post orelse return true, .put => formats.put orelse return true, .patch => formats.patch orelse return true, @@ -156,6 +160,7 @@ fn renderFn(self: Route, request: *jetzig.http.Request) anyerror!jetzig.views.Vi switch (self.view.dynamic) { .index => |view| return try view(request, request.response_data), .get => |view| return try view(request.path.resource_id, request, request.response_data), + .new => |view| return try view(request, request.response_data), .post => |view| return try view(request, request.response_data), .patch => |view| return try view(request.path.resource_id, request, request.response_data), .put => |view| return try view(request.path.resource_id, request, request.response_data), @@ -170,6 +175,7 @@ fn renderStaticFn(self: Route, request: *jetzig.http.StaticRequest) anyerror!jet switch (self.view.static) { .index => |view| return try view(request, request.response_data), .get => |view| return try view(try request.resourceId(), request, request.response_data), + .new => |view| return try view(request, request.response_data), .post => |view| return try view(request, request.response_data), .patch => |view| return try view(try request.resourceId(), request, request.response_data), .put => |view| return try view(try request.resourceId(), request, request.response_data),