summaryrefslogtreecommitdiff
path: root/src/eval.zig
diff options
context:
space:
mode:
Diffstat (limited to 'src/eval.zig')
-rw-r--r--src/eval.zig57
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);
},
}
}