diff options
| author | Lucas Faria Mendes <lucas.oliveira1676@etec.sp.gov.br> | 2025-12-05 07:57:40 +0000 |
|---|---|---|
| committer | Lucas Faria Mendes <lucas.oliveira1676@etec.sp.gov.br> | 2025-12-05 07:57:40 +0000 |
| commit | 16c43f33f8f7302a07778153aff59f565592bad8 (patch) | |
| tree | 87f27926a1c64bcafa0cfc07c89821ef657e8b35 /src/shell.zig | |
| parent | eef2bd90f9549858ab61d0bb697906fa1e41a373 (diff) | |
| download | shell-zig-16c43f33f8f7302a07778153aff59f565592bad8.tar.gz shell-zig-16c43f33f8f7302a07778153aff59f565592bad8.zip | |
codecrafters submit [skip ci]
Diffstat (limited to 'src/shell.zig')
| -rw-r--r-- | src/shell.zig | 42 |
1 files changed, 42 insertions, 0 deletions
diff --git a/src/shell.zig b/src/shell.zig index b15003e..53aaf3f 100644 --- a/src/shell.zig +++ b/src/shell.zig @@ -134,3 +134,45 @@ pub fn executeCommand( try stdout.print("{s}: command not found\n", .{cmd_name}); return .continue_loop; } + +pub fn executePipeline( + allocator: std.mem.Allocator, + stdout: anytype, + left_cmd: []const u8, + right_cmd: []const u8, +) !builtins.CommandResult { + const left_parsed = parser.parseCommand(left_cmd); + const right_parsed = parser.parseCommand(right_cmd); + + if (left_parsed.name.len == 0) { + try stdout.print("{s}: command not found\n", .{left_cmd}); + return .continue_loop; + } + if (right_parsed.name.len == 0) { + try stdout.print("{s}: command not found\n", .{right_cmd}); + return .continue_loop; + } + + const left_path = try path.findInPath(allocator, left_parsed.name); + defer if (left_path) |p| allocator.free(p); + if (left_path == null) { + try stdout.print("{s}: command not found\n", .{left_parsed.name}); + return .continue_loop; + } + + const right_path = try path.findInPath(allocator, right_parsed.name); + defer if (right_path) |p| allocator.free(p); + if (right_path == null) { + try stdout.print("{s}: command not found\n", .{right_parsed.name}); + return .continue_loop; + } + + const left_argv = try parser.parseArgs(allocator, left_parsed.name, left_parsed.args); + defer allocator.free(left_argv); + + const right_argv = try parser.parseArgs(allocator, right_parsed.name, right_parsed.args); + defer allocator.free(right_argv); + + try executor.runExternalPipeline(allocator, left_path.?, left_argv, right_path.?, right_argv); + return .continue_loop; +} |