feat: Integrates configuration-client.

This commit is contained in:
2024-12-23 16:30:15 -05:00
parent c7d349e3cc
commit e2309f5635
10 changed files with 290 additions and 245 deletions

View File

@@ -0,0 +1,61 @@
import ConfigurationClient
import Dependencies
import FileClient
import Foundation
extension Configuration {
func mergingTarget(_ otherTarget: Configuration.Target?) -> Self {
.init(
target: otherTarget ?? target,
strategy: strategy
)
}
func mergingStrategy(_ otherStrategy: Configuration.VersionStrategy?) -> Self {
.init(
target: target,
strategy: strategy?.merging(otherStrategy)
)
}
}
extension Configuration.Branch {
func merging(_ other: Self?) -> Self {
return .init(includeCommitSha: other?.includeCommitSha ?? includeCommitSha)
}
}
extension Configuration.SemVar {
func merging(_ other: Self?) -> Self {
.init(
preRelease: other?.preRelease ?? preRelease,
requireExistingFile: other?.requireExistingFile ?? requireExistingFile,
requireExistingSemVar: other?.requireExistingSemVar ?? requireExistingSemVar
)
}
}
extension Configuration.VersionStrategy {
func merging(_ other: Self?) -> Self {
guard let branch else {
guard let semvar else { return self }
return .init(semvar: semvar.merging(other?.semvar))
}
return .init(branch: branch.merging(other?.branch))
}
}
@discardableResult
func withConfiguration<T>(
path: String?,
_ operation: (Configuration) async throws -> T
) async throws -> T {
@Dependency(\.configurationClient) var configurationClient
let configuration = try await configurationClient.findAndLoad(
path != nil ? URL(filePath: path!) : nil
)
return try await operation(configuration)
}

View File

@@ -7,6 +7,12 @@ import Rainbow
struct GlobalOptions<Child: ParsableArguments>: ParsableArguments {
@Option(
name: .shortAndLong,
help: "Specify the path to a configuration file."
)
var configurationFile: String?
@OptionGroup var targetOptions: TargetOptions
@OptionGroup var child: Child
@@ -71,7 +77,7 @@ struct PreReleaseOptions: ParsableArguments {
var useTagAsPreRelease: Bool = false
@Option(
name: .shortAndLong,
name: .long,
help: """
Apply custom pre-release suffix, can also use branch or tag along with this
option as a prefix, used if branch is not set. (example: \"rc\")
@@ -103,14 +109,18 @@ typealias GlobalSemVarOptions = GlobalOptions<SemVarOptions>
typealias GlobalBranchOptions = GlobalOptions<Empty>
extension GlobalSemVarOptions {
func shared() throws -> CliClient.SharedOptions {
try shared(.semVar(child.semVarOptions()))
func shared() async throws -> CliClient.SharedOptions {
try await withConfiguration(path: configurationFile) { configuration in
try shared(configuration.mergingStrategy(.init(semvar: child.configSemVarOptions())))
}
}
}
extension GlobalBranchOptions {
func shared() throws -> CliClient.SharedOptions {
try shared(.branchAndCommit)
func shared() async throws -> CliClient.SharedOptions {
try await withConfiguration(path: configurationFile) { configuration in
try shared(configuration.mergingStrategy(.init(branch: .init())))
}
}
}
@@ -146,13 +156,12 @@ extension CliClient.SharedOptions {
extension GlobalOptions {
func shared(_ versionStrategy: CliClient.VersionStrategy) throws -> CliClient.SharedOptions {
try .init(
func shared(_ configuration: Configuration) throws -> CliClient.SharedOptions {
.init(
dryRun: dryRun,
gitDirectory: gitDirectory,
logLevel: .init(verbose: verbose),
target: targetOptions.target(),
versionStrategy: versionStrategy
configuration: configuration
)
}
@@ -188,26 +197,6 @@ private extension TargetOptions {
extension PreReleaseOptions {
func preReleaseStrategy() throws -> CliClient.PreReleaseStrategy? {
guard let custom else {
if useBranchAsPreRelease {
return .branchAndCommit
} else if useTagAsPreRelease {
return .tag
} else {
return nil
}
}
if useBranchAsPreRelease {
return .custom(custom, .branchAndCommit)
} else if useTagAsPreRelease {
return .custom(custom, .tag)
} else {
return .custom(custom, nil)
}
}
func configPreReleaseStrategy() throws -> Configuration.PreReleaseStrategy? {
guard let custom else {
if useBranchAsPreRelease {
@@ -230,13 +219,6 @@ extension PreReleaseOptions {
}
extension SemVarOptions {
func semVarOptions() throws -> CliClient.VersionStrategy.SemVarOptions {
try .init(
preReleaseStrategy: preRelease.preReleaseStrategy(),
requireExistingFile: requireExistingFile,
requireExistingSemVar: requireExistingSemvar
)
}
func configSemVarOptions() throws -> Configuration.SemVar {
try .init(