const std = @import("std"); const cdl = @import("root.zig"); pub const Options = struct { trimmed: bool = false, }; pub fn spawn(argv: []const []const u8, opts: ?Options) ![]const u8 { if (!std.process.can_spawn) { return error.NoChildProcess; } var child = try std.process.spawn(cdl.io, .{ .argv = argv, .environ_map = cdl.environ_map, .stdin = .ignore, .stdout = .pipe, .stderr = .ignore, }); var stdout_reader = child.stdout.?.readerStreaming(cdl.io, &.{}); const stdout = stdout_reader.interface.allocRemaining(cdl.gpa, .limited(0x100)) catch return error.ReadFailure; errdefer cdl.gpa.free(stdout); const term = try child.wait(cdl.io); const raw = blk: switch (term) { .exited => |code| { if (code != 0) { return error.ExitCodeFailure; } break :blk stdout; }, .signal, .stopped => return error.ProcessTerminated, .unknown => return error.ProcessTerminated, }; if (opts == null) return raw; if (opts) |o| if (o.trimmed) { defer cdl.gpa.free(raw); return try cdl.gpa.dupe(u8, std.mem.trim(u8, raw, " \n\r")); }; return raw; }