diff --git a/cli/src/commands/validate.zig b/cli/src/commands/validate.zig index bbed22d..e229a06 100644 --- a/cli/src/commands/validate.zig +++ b/cli/src/commands/validate.zig @@ -2,6 +2,7 @@ const std = @import("std"); const testing = std.testing; const Config = @import("../config.zig").Config; const ws = @import("../net/ws/client.zig"); +const protocol = @import("../net/protocol.zig"); const colors = @import("../utils/colors.zig"); const crypto = @import("../utils/crypto.zig"); const io = @import("../utils/io.zig"); @@ -78,7 +79,7 @@ pub fn run(allocator: std.mem.Allocator, args: []const []const u8) !void { const msg = try client.receiveMessage(allocator); defer allocator.free(msg); - const packet = @import("../net/protocol.zig").ResponsePacket.deserialize(msg, allocator) catch { + const packet = protocol.ResponsePacket.deserialize(msg, allocator) catch { if (opts.json) { var out = io.stdoutWriter(); try out.print("{s}\n", .{msg}); @@ -87,13 +88,7 @@ pub fn run(allocator: std.mem.Allocator, args: []const []const u8) !void { } return error.InvalidPacket; }; - defer { - if (packet.success_message) |m| allocator.free(m); - if (packet.error_message) |m| allocator.free(m); - if (packet.error_details) |m| allocator.free(m); - if (packet.data_type) |m| allocator.free(m); - if (packet.data_payload) |m| allocator.free(m); - } + defer packet.deinit(allocator); if (packet.packet_type == .error_packet) { try client.handleResponsePacket(packet, "validate"); @@ -115,7 +110,7 @@ pub fn run(allocator: std.mem.Allocator, args: []const []const u8) !void { const root = parsed.value.object; const ok = try printHumanReport(root, opts.verbose); - if (!ok) std.process.exit(1); + if (!ok) return error.ValidationFailed; } } diff --git a/cli/src/main.zig b/cli/src/main.zig index 4db218d..088f79b 100644 --- a/cli/src/main.zig +++ b/cli/src/main.zig @@ -22,77 +22,57 @@ pub fn main() !void { const command = args[1]; - // Track if we found a valid command - var command_found = false; - // Fast dispatch using switch on first character switch (command[0]) { 'j' => if (std.mem.eql(u8, command, "jupyter")) { - command_found = true; try @import("commands/jupyter.zig").run(allocator, args[2..]); }, 'i' => if (std.mem.eql(u8, command, "init")) { - command_found = true; colors.printInfo("Setup configuration interactively\n", .{}); } else if (std.mem.eql(u8, command, "info")) { - command_found = true; try @import("commands/info.zig").run(allocator, args[2..]); }, 'a' => if (std.mem.eql(u8, command, "annotate")) { - command_found = true; try @import("commands/annotate.zig").run(allocator, args[2..]); }, 'n' => if (std.mem.eql(u8, command, "narrative")) { - command_found = true; try @import("commands/narrative.zig").run(allocator, args[2..]); }, 's' => if (std.mem.eql(u8, command, "sync")) { - command_found = true; if (args.len < 3) { colors.printError("Usage: ml sync \n", .{}); - std.process.exit(1); + return error.InvalidArgs; } colors.printInfo("Sync project to server: {s}\n", .{args[2]}); } else if (std.mem.eql(u8, command, "status")) { - command_found = true; try @import("commands/status.zig").run(allocator, args[2..]); }, 'r' => if (std.mem.eql(u8, command, "requeue")) { - command_found = true; try @import("commands/requeue.zig").run(allocator, args[2..]); }, 'q' => if (std.mem.eql(u8, command, "queue")) { - command_found = true; try @import("commands/queue.zig").run(allocator, args[2..]); }, 'd' => if (std.mem.eql(u8, command, "dataset")) { - command_found = true; try @import("commands/dataset.zig").run(allocator, args[2..]); }, 'e' => if (std.mem.eql(u8, command, "experiment")) { - command_found = true; try @import("commands/experiment.zig").execute(allocator, args[2..]); }, 'c' => if (std.mem.eql(u8, command, "cancel")) { - command_found = true; try @import("commands/cancel.zig").run(allocator, args[2..]); }, 'v' => if (std.mem.eql(u8, command, "validate")) { - command_found = true; try @import("commands/validate.zig").run(allocator, args[2..]); }, 'l' => if (std.mem.eql(u8, command, "logs")) { - command_found = true; try @import("commands/logs.zig").run(allocator, args[2..]); }, - else => {}, - } - - // If no command was found, show error and exit - if (!command_found) { - colors.printError("Unknown command: {s}\n", .{args[1]}); - printUsage(); - std.process.exit(1); + else => { + colors.printError("Unknown command: {s}\n", .{args[1]}); + printUsage(); + return error.InvalidCommand; + }, } }