Issue #558
public class GetDestinations {
    public init() {}
    public func getAvailable(workflow: Workflow) throws -> [Destination] {
        let processHandler = DefaultProcessHandler(filter: { $0.starts(with: "name=") })
        let string = try CommandLine().runBash(
            workflow: workflow,
            program: "xcrun instruments",
            arguments: [
                "-s",
                "devices"
            ],
            processHandler: processHandler
        )
        // Ex: iPad Air (11.0.1) [7A5EAD29-D870-49FB-9A9B-C81079620AC9] (Simulator)
        let destinations: [Destination] = try string
            .split(separator: "\n")
            .map({ String($0) })
            .filter({ try $0.hasPattern(pattern: #"\[.+\]"#) })
            .compactMap({ (line) -> Destination? in
                parse(line)
            })
        return destinations
    }
    func parse(_ line: String) -> Destination? {
        guard var id = try? line.matches(pattern: #"\[.+\]"#).first else {
            return nil
        }
        var line = line
        line = line.replacingOccurrences(of: id, with: "")
        id = id
            .replacingOccurrences(of: "[", with: "")
            .replacingOccurrences(of: "]", with: "")
        let isSimulator = line.contains("(Simulator)")
        line = line.replacingOccurrences(of: "(Simulator)", with: "")
        var os = (try? line.matches(pattern: #"\((\d+\.)?(\d+\.)?(\*|\d+)\)"#).first) ?? ""
        let name = line
            .replacingOccurrences(of: os, with: "")
            .trimmingCharacters(in: .whitespacesAndNewlines)
        os = os.replacingOccurrences(of: "(", with: "")
            .replacingOccurrences(of: ")", with: "")
        let device = self.device(name: name)
        if os.isEmpty {
            return Destination(name: name, id: id)
        } else {
            let platform = isSimulator ? "\(device) Simulator" : device
            return Destination(name: name, platform: platform, os: os)
        }
    }
    // MARK: - Private
    private func device(name: String) -> String {
        if name.starts(with: "iPad") || name.starts(with: "iPhone") {
            return Destination.Platform.iOS
        } else if name.starts(with: "Apple Watch") {
            return Destination.Platform.watchOS
        } else if name.starts(with: "Apple TV") {
            return Destination.Platform.tvOS
        } else if name.containsIgnoringCase("mac") {
            return Destination.Platform.macOS
        } else {
            return Destination.Platform.iOS
        }
    }
}
Start the conversation