const std = @import("std"); const Allocator = std.mem.Allocator; const print = std.debug.print; const syntax = @import("../syntax.zig"); const FileSpec = syntax.FileSpec; const types = @import("./lib/types.zig"); const CommandStatus = types.CommandStatus; const OutputCapture = types.OutputCapture; const InputSource = types.InputSource; pub const Rename = struct { from: FileSpec, to: FileSpec, pub fn eval(rename: Rename, allocator: Allocator, output_capture: ?*OutputCapture, input_source: ?*InputSource) !CommandStatus { _ = allocator; _ = input_source; const from_path = switch (rename.from) { .Con, .Lpt1, .Lpt2, .Lpt3, .Prn => { const error_msg = "Cannot rename device\n"; if (output_capture) |capture| { try capture.write(error_msg); } else { print("{s}", .{error_msg}); } return CommandStatus{ .Code = 1 }; }, .Path => |path| path, }; const to_path = switch (rename.to) { .Con, .Lpt1, .Lpt2, .Lpt3, .Prn => { const error_msg = "Cannot rename to device\n"; if (output_capture) |capture| { try capture.write(error_msg); } else { print("{s}", .{error_msg}); } return CommandStatus{ .Code = 1 }; }, .Path => |path| path, }; std.fs.cwd().rename(from_path, to_path) catch |err| { const error_msg = switch (err) { error.FileNotFound => "The system cannot find the file specified\n", error.AccessDenied => "Access denied\n", error.PathAlreadyExists => "A duplicate file name exists, or the file cannot be found\n", error.RenameAcrossMountPoints => "Cannot rename across different drives\n", else => "Cannot rename file\n", }; if (output_capture) |capture| { try capture.write(error_msg); } else { print("{s}", .{error_msg}); } return CommandStatus{ .Code = 1 }; }; // No output for successful rename (DOS style) return CommandStatus{ .Code = 0 }; } };