Files
darwin-apk/Sources/apk/Index/ApkIndexProvides.swift

61 lines
1.4 KiB
Swift

/*
* darwin-apk © 2024, 2025 Gay Pizza Specifications
* SPDX-License-Identifier: Apache-2.0
*/
import Foundation
public enum ApkIndexProvides: Hashable, Sendable {
case any(name: String)
case specific(name: String, version: String)
}
extension ApkIndexProvides {
init(requirement: ApkVersionRequirement) throws(ProvidesError) {
self = switch requirement.versionSpec {
case .any(invert: false):
.any(name: requirement.name)
case .constraint(invert: false, op: .equals, let version):
.specific(name: requirement.name, version: version)
default:
throw .badConstraint
}
}
func satisfies(_ requirement: ApkVersionRequirement) -> Bool {
switch self {
case .any(let name):
return requirement.name == name
case .specific(let name, let version):
return requirement.name == name &&
requirement.versionSpec.satisfied(by: version)
}
}
enum ProvidesError: Error, LocalizedError {
case badConstraint
var errorDescription: String? {
switch self {
case .badConstraint: "Invalid constraint type, must only be equals"
}
}
}
}
extension ApkIndexProvides: CustomStringConvertible {
public var description: String {
switch self {
case .any(let name): name
case .specific(let name, let version): "\(name)=\(version)"
}
}
public var name: String {
switch self {
case .any(let name): name
case .specific(let name, _): name
}
}
}