Add skeleton for verbosity

This commit is contained in:
Simon Kågedal Reimer 2019-06-03 07:24:14 +02:00
parent 4e15f26823
commit 6124c3e6d1
10 changed files with 71 additions and 24 deletions

View File

@ -29,7 +29,8 @@ struct CommandLineOptions {
struct NoCommandError: Swift.Error { }
private let parser: ArgumentParser
private(set) var subCommand: SubCommand
fileprivate(set) var subCommand: SubCommand
fileprivate(set) var verbosity: Verbosity
private static let allCommands: [Command] = [
ListDevicesCommand(),
@ -47,16 +48,7 @@ struct CommandLineOptions {
)
let binder = ArgumentBinder<CommandLineOptions>()
binder.bind(
option: parser.add(
option: "--version",
kind: Bool.self,
usage: "Prints the version and exits"
), to: { options, _ in
options.subCommand = .version
}
)
binder.bind(parser)
for command in allCommands {
let subparser = parser.add(
@ -66,7 +58,7 @@ struct CommandLineOptions {
command.addOptions(to: subparser)
}
var options = CommandLineOptions(parser: parser, subCommand: .noCommand)
var options = CommandLineOptions(parser: parser, subCommand: .noCommand, verbosity: .normal)
checkresult: do {
let result = try parser.parse(arguments)
try binder.fill(parseResult: result, into: &options)
@ -98,3 +90,28 @@ struct CommandLineOptions {
parser.printUsage(on: stream)
}
}
extension ArgumentBinder where Options == CommandLineOptions {
func bind(_ parser: ArgumentParser) {
bind(
option: parser.add(
option: "--version",
kind: Bool.self,
usage: "Prints the version and exits"
), to: { options, _ in
options.subCommand = .version
}
)
bind(
option: parser.add(
option: "--verbosity",
kind: Verbosity.self,
usage: "Verbosity: silent|normal|loud, defaults to normal"
), to: { options, verbosity in
options.verbosity = verbosity
}
)
}
}

View File

@ -19,7 +19,7 @@ struct FilteringOptions {
}
extension ArgumentBinder where Options == FilteringOptions {
func bind(to options: inout FilteringOptions, parser: ArgumentParser) {
func bind(_ parser: ArgumentParser) {
bind(option: parser.add(
option: "--availability",
kind: FilteringOptions.Availability.self,

View File

@ -0,0 +1,14 @@
//
// Copyright © 2019 Simon Kågedal Reimer. See LICENSE.
//
import Foundation
import SPMUtility
enum Verbosity: String, StringEnumArgument {
case silent
case normal
case loud
public static var completion: ShellCompletion = .none
}

View File

@ -14,5 +14,5 @@ protocol Command {
func addOptions(to parser: ArgumentParser)
func fillParseResult(_ parseResult: ArgumentParser.Result) throws
func run() throws
func run(reporter: Reporter) throws
}

View File

@ -21,7 +21,7 @@ class ExportCACommand: Command {
private var exportedCertificates: Set<Data> = []
func addOptions(to parser: ArgumentParser) {
filteringBinder.bind(to: &filteringOptions, parser: parser)
filteringBinder.bind(parser)
}
func fillParseResult(_ parseResult: ArgumentParser.Result) throws {
@ -29,7 +29,7 @@ class ExportCACommand: Command {
try filteringBinder.fill(parseResult: parseResult, into: &filteringOptions)
}
func run() throws {
func run(reporter: Reporter) throws {
exportedCertificates = []
for device in try Simctl.flatListDevices().filter(using: filteringOptions) {
exportCertificates(for: device)

View File

@ -36,7 +36,7 @@ class InstallCACommand: Command {
options.path = path
})
filteringBinder.bind(to: &filteringOptions, parser: parser)
filteringBinder.bind(parser)
}
func fillParseResult(_ parseResult: ArgumentParser.Result) throws {
@ -44,7 +44,7 @@ class InstallCACommand: Command {
try filteringBinder.fill(parseResult: parseResult, into: &filteringOptions)
}
func run() throws {
func run(reporter: Reporter) throws {
let url = URL(fileURLWithPath: options.path!)
let certificate = try Certificate.load(from: url)
let sha1 = certificate.sha1

View File

@ -14,15 +14,14 @@ class ListDevicesCommand: Command {
private let filteringBinder = ArgumentBinder<FilteringOptions>()
func addOptions(to parser: ArgumentParser) {
filteringBinder.bind(to: &filteringOptions, parser: parser)
filteringBinder.bind(parser)
}
func fillParseResult(_ parseResult: ArgumentParser.Result) throws {
try filteringBinder.fill(parseResult: parseResult, into: &filteringOptions)
// try binder.fill(parseResult: parseResult, into: &self)
}
func run() throws {
func run(reporter: Reporter) throws {
let allDevices = try Simctl.listDevices()
for (runtime, devices) in allDevices.devices {
let filteredDevices = devices.filter(using: filteringOptions)

View File

@ -27,7 +27,7 @@ class RemoveCACommand: Command {
options.dryRun = dryRun
})
filteringBinder.bind(to: &filteringOptions, parser: parser)
filteringBinder.bind(parser)
}
func fillParseResult(_ parseResult: ArgumentParser.Result) throws {
@ -35,7 +35,7 @@ class RemoveCACommand: Command {
try filteringBinder.fill(parseResult: parseResult, into: &filteringOptions)
}
func run() throws {
func run(reporter: Reporter) throws {
for device in try Simctl.flatListDevices().filter(using: filteringOptions) {
let trustStore = TrustStore(uuid: device.udid)
if trustStore.exists {

View File

@ -0,0 +1,17 @@
//
// Copyright © 2019 Simon Kågedal Reimer. See LICENSE.
//
import Foundation
protocol Reporter {
}
class DefaultReporter: Reporter {
private let verbosity: Verbosity
init(verbosity: Verbosity) {
self.verbosity = verbosity
}
}

View File

@ -41,7 +41,7 @@ public class XcodeSimulatorTool {
case .version:
print("xcode-simulator-tool version \(XcodeSimulatorTool.version)")
case .command(let command):
try command.run()
try command.run(reporter: DefaultReporter(verbosity: options.verbosity))
}
}
}