import ArgumentParser import CommandClient import VaultClient // 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 extraOptions: [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 runOptions( commandName: String, outputFilePath: String? = nil ) -> VaultClient.RunOptions { .init( extraOptions: extraOptions, loggingOptions: .init( commandName: commandName, logLevel: .init(globals: globals, quietOnlyPlaybook: false) ), outputFilePath: outputFilePath, quiet: globals.quiet, shell: globals.shell, vaultFilePath: file ) } }