From 1302b15ee2760e875399c0436e8c00fa39ab86c1 Mon Sep 17 00:00:00 2001 From: Michael Housh Date: Mon, 16 Dec 2024 10:57:14 -0500 Subject: [PATCH] feat: Integrates vault-client into hpa-executable. --- Package.swift | 1 + .../hpa/VaultCommands/DecryptCommand.swift | 21 +++++++--------- .../hpa/VaultCommands/EncryptCommand.swift | 22 ++++++++-------- Sources/hpa/VaultCommands/VaultOptions.swift | 25 ++++++++++++++++++- 4 files changed, 44 insertions(+), 25 deletions(-) diff --git a/Package.swift b/Package.swift index 0deab32..123de6f 100644 --- a/Package.swift +++ b/Package.swift @@ -31,6 +31,7 @@ let package = Package( "ConfigurationClient", "FileClient", "PlaybookClient", + "VaultClient", .product(name: "ArgumentParser", package: "swift-argument-parser"), .product(name: "CliDoc", package: "swift-cli-doc"), .product(name: "Dependencies", package: "swift-dependencies"), diff --git a/Sources/hpa/VaultCommands/DecryptCommand.swift b/Sources/hpa/VaultCommands/DecryptCommand.swift index 9c1dc2d..c8ad6b0 100644 --- a/Sources/hpa/VaultCommands/DecryptCommand.swift +++ b/Sources/hpa/VaultCommands/DecryptCommand.swift @@ -1,6 +1,7 @@ import ArgumentParser import CliClient import Dependencies +import VaultClient struct DecryptCommand: AsyncParsableCommand { @@ -11,25 +12,21 @@ struct DecryptCommand: AsyncParsableCommand { abstract: createAbstract("Decrypt a vault file.") ) - @OptionGroup var options: VaultOptions - @Option( name: .shortAndLong, help: "Output file." ) var output: String? + @OptionGroup var options: VaultOptions + mutating func run() async throws { - @Dependency(\.cliClient) var cliClient + @Dependency(\.vaultClient) var vaultClient - var args = ["decrypt"] - if let output { - args.append(contentsOf: ["--output", output]) - } - - try await cliClient.runVaultCommand( - options.vaultOptions(arguments: args, configuration: nil), - logging: options.loggingOptions(commandName: Self.commandName) - ) + try await vaultClient.run(options.runOptions( + commandName: Self.commandName, + route: .decrypt, + outputFilePath: output + )) } } diff --git a/Sources/hpa/VaultCommands/EncryptCommand.swift b/Sources/hpa/VaultCommands/EncryptCommand.swift index d916dd2..5fb9542 100644 --- a/Sources/hpa/VaultCommands/EncryptCommand.swift +++ b/Sources/hpa/VaultCommands/EncryptCommand.swift @@ -1,6 +1,7 @@ import ArgumentParser import CliClient import Dependencies +import VaultClient struct EncryptCommand: AsyncParsableCommand { @@ -11,24 +12,21 @@ struct EncryptCommand: AsyncParsableCommand { abstract: createAbstract("Encrypt a vault file.") ) - @OptionGroup var options: VaultOptions - @Option( name: .shortAndLong, help: "Output file." ) var output: String? - mutating func run() async throws { - @Dependency(\.cliClient) var cliClient + @OptionGroup var options: VaultOptions - var args = ["encrypt"] - if let output { - args.append(contentsOf: ["--output", output]) - } - try await cliClient.runVaultCommand( - options.vaultOptions(arguments: args, configuration: nil), - logging: options.loggingOptions(commandName: Self.commandName) - ) + mutating func run() async throws { + @Dependency(\.vaultClient) var vaultClient + + try await vaultClient.run(options.runOptions( + commandName: Self.commandName, + route: .encrypt, + outputFilePath: output + )) } } diff --git a/Sources/hpa/VaultCommands/VaultOptions.swift b/Sources/hpa/VaultCommands/VaultOptions.swift index 47ff701..34d6c50 100644 --- a/Sources/hpa/VaultCommands/VaultOptions.swift +++ b/Sources/hpa/VaultCommands/VaultOptions.swift @@ -1,5 +1,6 @@ import ArgumentParser import CliClient +import VaultClient // Holds the common options for vault commands, as they all share the // same structure. @@ -18,7 +19,7 @@ struct VaultOptions: ParsableArguments { @Argument( help: "Extra arguments to pass to the vault command." ) - var extraArgs: [String] = [] + var extraOptions: [String] = [] subscript(dynamicMember keyPath: WritableKeyPath) -> T { get { globals[keyPath: keyPath] } @@ -36,3 +37,25 @@ extension VaultOptions { globals.loggingOptions(commandName: commandName) } } + +extension VaultOptions { + + func runOptions( + commandName: String, + route: VaultClient.RunOptions.Route, + outputFilePath: String? = nil + ) -> VaultClient.RunOptions { + .init( + route, + extraOptions: extraOptions, + loggingOptions: .init( + commandName: commandName, + logLevel: .init(globals: globals, quietOnlyPlaybook: false) + ), + outputFilePath: outputFilePath, + quiet: globals.quiet, + shell: globals.shell, + vaultFilePath: file + ) + } +}