import ArgumentParser import CliClient // Holds the common options for vault commands, as they all share the // same structure. @dynamicMemberLookup struct VaultOptions: ParsableArguments { @OptionGroup var globals: BasicGlobalOptions @Option( name: .shortAndLong, help: "The vault file path.", completion: .file() ) var file: String? @Argument( help: "Extra arguments to pass to the vault command." ) var extraArgs: [String] = [] subscript(dynamicMember keyPath: WritableKeyPath) -> T { get { globals[keyPath: keyPath] } set { globals[keyPath: keyPath] = newValue } } subscript(dynamicMember keyPath: KeyPath) -> T { globals[keyPath: keyPath] } } extension VaultOptions { func loggingOptions(commandName: String) -> CliClient.LoggingOptions { globals.loggingOptions(commandName: commandName) } }