diff options
Diffstat (limited to 'src/eval.zig')
-rw-r--r-- | src/eval.zig | 57 |
1 files changed, 31 insertions, 26 deletions
diff --git a/src/eval.zig b/src/eval.zig index a689837..7aaae4b 100644 --- a/src/eval.zig +++ b/src/eval.zig @@ -30,6 +30,7 @@ const cmdTypes = @import("cmd/lib/types.zig"); pub const CommandStatus = cmdTypes.CommandStatus; const OutputCapture = cmdTypes.OutputCapture; const InputSource = cmdTypes.InputSource; +const CommandContext = cmdTypes.CommandContext; const STDOUT_BUFFER_SIZE: usize = 1024; const STDERR_BUFFER_SIZE: usize = 1024; @@ -39,78 +40,80 @@ pub fn executeCommand(command: Command, allocator: Allocator) !CommandStatus { } pub fn executeCommandWithOutput(command: Command, allocator: Allocator, output_capture: ?*OutputCapture, input_source: ?*InputSource) !CommandStatus { + const ctx = CommandContext.init(allocator, output_capture, input_source); + switch (command) { .Empty => return CommandStatus{ .Code = 0 }, .Builtin => |builtin_cmd| { switch (builtin_cmd) { .EchoText => |echo_text| { - return echo_text.eval(allocator, output_capture, input_source); + return echo_text.eval(ctx); }, .Cls => |cls| { - return cls.eval(allocator, output_capture, input_source); + return cls.eval(ctx); }, .Exit => { return CommandStatus.ExitShell; }, .EchoPlain => |echo_plain| { - return echo_plain.eval(allocator, output_capture, input_source); + return echo_plain.eval(ctx); }, .EchoOn => |echo_on| { - return echo_on.eval(allocator, output_capture, input_source); + return echo_on.eval(ctx); }, .EchoOff => |echo_off| { - return echo_off.eval(allocator, output_capture, input_source); + return echo_off.eval(ctx); }, .Ver => |ver| { - return ver.eval(allocator, output_capture, input_source); + return ver.eval(ctx); }, .Date => |date| { - return date.eval(allocator, output_capture, input_source); + return date.eval(ctx); }, .Time => |time| { - return time.eval(allocator, output_capture, input_source); + return time.eval(ctx); }, .Dir => |dir| { - return dir.eval(allocator, output_capture, input_source); + return dir.eval(ctx); }, .Type => |type_cmd| { - return type_cmd.eval(allocator, output_capture, input_source); + return type_cmd.eval(ctx); }, .Sort => |sort| { - return sort.eval(allocator, output_capture, input_source); + return sort.eval(ctx); }, .Chdir => |chdir| { - return chdir.eval(allocator, output_capture, input_source); + return chdir.eval(ctx); }, .Copy => |copy| { - return copy.eval(allocator, output_capture, input_source); + return copy.eval(ctx); }, .Remove => |remove| { - return remove.eval(allocator, output_capture, input_source); + return remove.eval(ctx); }, .Mkdir => |mkdir| { - return mkdir.eval(allocator, output_capture, input_source); + return mkdir.eval(ctx); }, .Rmdir => |rmdir| { - return rmdir.eval(allocator, output_capture, input_source); + return rmdir.eval(ctx); }, .Rename => |rename| { - return rename.eval(allocator, output_capture, input_source); + return rename.eval(ctx); }, .Move => |move| { - return move.eval(allocator, output_capture, input_source); + return move.eval(ctx); }, .PathGet => |path_get| { - return path_get.eval(allocator, output_capture, input_source); + return path_get.eval(ctx); }, .PathSet => |path_set| { - return path_set.eval(allocator, output_capture, input_source); + return path_set.eval(ctx); }, else => { - const error_msg = try std.fmt.allocPrint(allocator, "Command not implemented: {any}\n", .{builtin_cmd}); - defer allocator.free(error_msg); - if (output_capture) |capture| { + const error_msg = try std.fmt.allocPrint(ctx.allocator, "Command not implemented: {any}\n", .{builtin_cmd}); + defer ctx.allocator.free(error_msg); + if (ctx.output_capture) |capture| { try capture.write(error_msg); } else { print("{s}", .{error_msg}); @@ -121,15 +124,17 @@ pub fn executeCommandWithOutput(command: Command, allocator: Allocator, output_c }, .External => |external| { - return external.eval(allocator, output_capture, input_source); + return external.eval(ctx); }, .Redirect => |redirect| { - return redirect.eval(allocator, output_capture, input_source, executeCommandWithOutput); + const ctx_with_executor = CommandContext.with_executor(allocator, output_capture, input_source, executeCommandWithOutput); + return redirect.eval(ctx_with_executor); }, .Pipe => |pipe| { - return pipe.eval(allocator, output_capture, input_source, executeCommandWithOutput); + const ctx_with_executor = CommandContext.with_executor(allocator, output_capture, input_source, executeCommandWithOutput); + return pipe.eval(ctx_with_executor); }, } } |