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 .semvar(semvar.merging(other?.semvar)) } return .branch(branch.merging(other?.branch)) } } @discardableResult func withConfiguration( 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) }