From 1c2cbaca770d2a28af2b6c4f4d90324d0944bbc1 Mon Sep 17 00:00:00 2001 From: Bob Farrell Date: Fri, 30 Aug 2024 18:03:06 +0100 Subject: [PATCH] WIP --- build.zig | 6 +++- build.zig.zon | 5 +-- cli/build.zig | 6 ++++ cli/build.zig.zon | 3 ++ cli/commands/generate.zig | 26 +++++++++----- cli/commands/generate/migration.zig | 34 +++++++++++++++++++ .../migrations/2024-08-25_13-18-52_hello.zig | 9 +++++ 7 files changed, 77 insertions(+), 12 deletions(-) create mode 100644 cli/commands/generate/migration.zig create mode 100644 demo/src/app/database/migrations/2024-08-25_13-18-52_hello.zig diff --git a/build.zig b/build.zig index 366a9a8..95620a6 100644 --- a/build.zig +++ b/build.zig @@ -55,7 +55,11 @@ pub fn build(b: *std.Build) !void { const zmpl_module = zmpl_dep.module("zmpl"); const jetkv_dep = b.dependency("jetkv", .{ .target = target, .optimize = optimize }); - const jetquery_dep = b.dependency("jetquery", .{ .target = target, .optimize = optimize }); + const jetquery_dep = b.dependency("jetquery", .{ + .target = target, + .optimize = optimize, + .jetquery_migrations_path = @as([]const u8, "src/app/database/migrations"), + }); const zmd_dep = b.dependency("zmd", .{ .target = target, .optimize = optimize }); const httpz_dep = b.dependency("httpz", .{ .target = target, .optimize = optimize }); const pg_dep = b.dependency("pg", .{ .target = target, .optimize = optimize }); diff --git a/build.zig.zon b/build.zig.zon index 5cf2d90..fdc4128 100644 --- a/build.zig.zon +++ b/build.zig.zon @@ -22,8 +22,9 @@ .hash = "1220411a8c46d95bbf3b6e2059854bcb3c5159d428814099df5294232b9980517e9c", }, .pg = .{ - .url = "https://github.com/karlseguin/pg.zig/archive/1b4011d4c8218c70471477e283608daf919bee3a.tar.gz", - .hash = "122086d9461b75535b630019374f8a068eff467e657a46d2bb577fe0a507f1cd2fca", + // .url = "https://github.com/karlseguin/pg.zig/archive/1491270ac43c7eba91992bb06b3758254c36e39a.tar.gz", + // .hash = "1220bcc68967188de7ad5d520a4629c0d1e169c111d87e6978a3c128de5ec2b6bdd0", + .path = "../pg.zig", }, .smtp_client = .{ .url = "https://github.com/karlseguin/smtp_client.zig/archive/8fcfad9ca2d9e446612c79f4e54050cfbe81b38d.tar.gz", diff --git a/cli/build.zig b/cli/build.zig index d4743d5..f34154e 100644 --- a/cli/build.zig +++ b/cli/build.zig @@ -14,6 +14,12 @@ pub fn build(b: *std.Build) !void { }); const zig_args_dep = b.dependency("args", .{ .target = target, .optimize = optimize }); + const jetquery_dep = b.dependency("jetquery", .{ + .target = target, + .optimize = optimize, + .jetquery_migrations_path = @as([]const u8, "src/app/database/migrations"), + }); + exe.root_module.addImport("jetquery", jetquery_dep.module("jetquery")); exe.root_module.addImport("args", zig_args_dep.module("args")); exe.root_module.addImport( diff --git a/cli/build.zig.zon b/cli/build.zig.zon index cbbbfd1..c4f68b5 100644 --- a/cli/build.zig.zon +++ b/cli/build.zig.zon @@ -8,6 +8,9 @@ .url = "https://github.com/ikskuh/zig-args/archive/0abdd6947a70e6d8cc83b66228cea614aa856206.tar.gz", .hash = "1220411a8c46d95bbf3b6e2059854bcb3c5159d428814099df5294232b9980517e9c", }, + .jetquery = .{ + .path = "../../jetquery", + }, }, .paths = .{ "", diff --git a/cli/commands/generate.zig b/cli/commands/generate.zig index fd7259f..b5c971a 100644 --- a/cli/commands/generate.zig +++ b/cli/commands/generate.zig @@ -9,11 +9,12 @@ const layout = @import("generate/layout.zig"); const middleware = @import("generate/middleware.zig"); const job = @import("generate/job.zig"); const mailer = @import("generate/mailer.zig"); +const migration = @import("generate/migration.zig"); /// Command line options for the `generate` command. pub const Options = struct { pub const meta = .{ - .usage_summary = "[view|partial|layout|mailer|middleware|job|secret] [options]", + .usage_summary = "[view|partial|layout|mailer|middleware|job|secret|migration] [options]", .full_text = \\Generate scaffolding for views, middleware, and other objects. \\ @@ -38,7 +39,7 @@ pub fn run( _ = options; - const Generator = enum { view, partial, layout, mailer, middleware, job, secret }; + const Generator = enum { view, partial, layout, mailer, middleware, job, secret, migration }; var sub_args = std.ArrayList([]const u8).init(allocator); defer sub_args.deinit(); @@ -55,6 +56,7 @@ pub fn run( .{ "mailer", .mailer }, .{ "middleware", .middleware }, .{ "secret", .secret }, + .{ "migration", .migration }, }); for (inner_map.kvs) |kv| try available_buf.append(kv.key); break :blk inner_map; @@ -67,6 +69,7 @@ pub fn run( .{ "mailer", .mailer }, .{ "middleware", .middleware }, .{ "secret", .secret }, + .{ "migration", .migration }, }); for (inner_map.keys()) |key| try available_buf.append(key); break :blk inner_map; @@ -75,6 +78,10 @@ pub fn run( const available_help = try std.mem.join(allocator, "|", available_buf.items); defer allocator.free(available_help); + var arena_allocator = std.heap.ArenaAllocator.init(allocator); + defer arena_allocator.deinit(); + const arena = arena_allocator.allocator(); + const generate_type: ?Generator = if (positionals.len > 0) map.get(positionals[0]) else null; if (positionals.len > 1) { @@ -91,13 +98,14 @@ pub fn run( if (generate_type) |capture| { return switch (capture) { - .view => view.run(allocator, cwd, sub_args.items, other_options.help), - .partial => partial.run(allocator, cwd, sub_args.items, other_options.help), - .layout => layout.run(allocator, cwd, sub_args.items, other_options.help), - .mailer => mailer.run(allocator, cwd, sub_args.items, other_options.help), - .job => job.run(allocator, cwd, sub_args.items, other_options.help), - .middleware => middleware.run(allocator, cwd, sub_args.items, other_options.help), - .secret => secret.run(allocator, cwd, sub_args.items, other_options.help), + .view => view.run(arena, cwd, sub_args.items, other_options.help), + .partial => partial.run(arena, cwd, sub_args.items, other_options.help), + .layout => layout.run(arena, cwd, sub_args.items, other_options.help), + .mailer => mailer.run(arena, cwd, sub_args.items, other_options.help), + .job => job.run(arena, cwd, sub_args.items, other_options.help), + .middleware => middleware.run(arena, cwd, sub_args.items, other_options.help), + .secret => secret.run(arena, cwd, sub_args.items, other_options.help), + .migration => migration.run(arena, cwd, sub_args.items, other_options.help), }; } } diff --git a/cli/commands/generate/migration.zig b/cli/commands/generate/migration.zig new file mode 100644 index 0000000..34b20e4 --- /dev/null +++ b/cli/commands/generate/migration.zig @@ -0,0 +1,34 @@ +const std = @import("std"); + +const jetquery = @import("jetquery"); + +/// Run the migration generator. Create a migration in `src/app/database/migrations/` +pub fn run(allocator: std.mem.Allocator, cwd: std.fs.Dir, args: [][]const u8, help: bool) !void { + if (help or args.len != 1) { + std.debug.print( + \\Generate a new Migration. Migrations modify the application's database schema. + \\ + \\Example: + \\ + \\ jetzig generate migration create_iguanas + \\ + , .{}); + + if (help) return; + + return error.JetzigCommandError; + } + + const name = args[0]; + + const migrations_dir = try cwd.makeOpenPath( + try std.fs.path.join(allocator, &.{ "src", "app", "database", "migrations" }), + .{}, + ); + const migration = jetquery.Migration.init( + allocator, + name, + .{ .migrations_path = try migrations_dir.realpathAlloc(allocator, ".") }, + ); + try migration.save(); +} diff --git a/demo/src/app/database/migrations/2024-08-25_13-18-52_hello.zig b/demo/src/app/database/migrations/2024-08-25_13-18-52_hello.zig new file mode 100644 index 0000000..8191eab --- /dev/null +++ b/demo/src/app/database/migrations/2024-08-25_13-18-52_hello.zig @@ -0,0 +1,9 @@ +const jetquery = @import("jetquery"); + +pub fn up(repo: *jetquery.Repo) !void { + _ = repo; +} + +pub fn down(repo: *jetquery.Repo) !void { + _ = repo; +}