3/// ScriptHelper is a helper for invoking AppleScript.
6 /// Execute an AppleScript via osascript with the provided arguments.
7 /// Returns the output or throws an error.
9 static func runAppleScript(_ script: String, arguments: [String]) async throws -> String {
10 try await Task.detached(priority: .userInitiated) {
12 task.launchPath = "/usr/bin/osascript"
14 var args = ["-e", script]
15 args.append(contentsOf: arguments)
18 let stdoutPipe = Pipe()
19 let stderrPipe = Pipe()
20 task.standardOutput = stdoutPipe
21 task.standardError = stderrPipe
26 let stdout = self.readAsString(stdoutPipe)
27 let stderr = self.readAsString(stderrPipe)
29 print("AppleScript output: status=\(task.terminationStatus), stdout=\(stdout), stderr=\(stderr)")
31 if task.terminationStatus != 0 {
32 let errorMessage = stderr.isEmpty ? "Unknown AppleScript execution error." : "AppleScript execution error: \(stderr)"
34 domain: "ScriptHelperDomain",
35 code: Int(task.terminationStatus),
36 userInfo: [NSLocalizedDescriptionKey: errorMessage]
44 private static func readAsString(_ p: Pipe) -> String {
45 let data = p.fileHandleForReading.readDataToEndOfFile()
46 guard let output = String(data: data, encoding: .utf8) else {
50 return output.trimmingCharacters(in: .whitespacesAndNewlines)