mirror of
https://github.com/GayPizzaSpecifications/darwin-apk.git
synced 2025-08-04 05:51:31 +00:00
Add requirement-based resolution to index
This commit is contained in:
@ -7,6 +7,7 @@ import Foundation
|
|||||||
|
|
||||||
public struct ApkIndex: Sendable {
|
public struct ApkIndex: Sendable {
|
||||||
public let packages: [ApkIndexPackage]
|
public let packages: [ApkIndexPackage]
|
||||||
|
public typealias Index = Array<ApkIndexPackage>.Index
|
||||||
}
|
}
|
||||||
|
|
||||||
public extension ApkIndex {
|
public extension ApkIndex {
|
||||||
@ -21,6 +22,18 @@ public extension ApkIndex {
|
|||||||
$0.name == name
|
$0.name == name
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func resolve(requirement: ApkVersionRequirement) -> ApkIndexPackage? {
|
||||||
|
self.packages.first {
|
||||||
|
$0.name == requirement.name && requirement.versionSpec.satisfied(by: $0.version)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func resolveIndex(requirement: ApkVersionRequirement) -> Index? {
|
||||||
|
self.packages.firstIndex {
|
||||||
|
$0.name == requirement.name && requirement.versionSpec.satisfied(by: $0.version)
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public extension ApkIndex {
|
public extension ApkIndex {
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
|
||||||
internal struct ApkVersionRequirement: Sendable, Hashable {
|
public struct ApkVersionRequirement: Sendable, Hashable {
|
||||||
let name: String
|
let name: String
|
||||||
let versionSpec: ApkVersionSpecification
|
let versionSpec: ApkVersionSpecification
|
||||||
|
|
||||||
@ -49,7 +49,7 @@ internal struct ApkVersionRequirement: Sendable, Hashable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
extension ApkVersionRequirement: CustomStringConvertible {
|
extension ApkVersionRequirement: CustomStringConvertible {
|
||||||
var description: String {
|
public var description: String {
|
||||||
switch self.versionSpec {
|
switch self.versionSpec {
|
||||||
case .any(let invert):
|
case .any(let invert):
|
||||||
"\(invert ? "!" : "")\(self.name)"
|
"\(invert ? "!" : "")\(self.name)"
|
||||||
|
@ -30,6 +30,51 @@ internal extension ApkVersionSpecification {
|
|||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func satisfied(by version: String) -> Bool {
|
||||||
|
switch self {
|
||||||
|
case .any:
|
||||||
|
//return true
|
||||||
|
return ApkVersionCompare.validate(version)
|
||||||
|
case .constraint(_ , let op, let requiredVersion):
|
||||||
|
switch ApkVersionCompare.compare(version, requiredVersion, mode: op.isFuzzy ? .fuzzy : .normal) {
|
||||||
|
case .equal: return op.isEqual
|
||||||
|
case .greater: return op.isGreater
|
||||||
|
case .less: return op.isLess
|
||||||
|
default: return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
internal extension ApkVersionSpecification.Operator {
|
||||||
|
@inlinable var isFuzzy: Bool {
|
||||||
|
switch self {
|
||||||
|
case .fuzzyEquals, .lessFuzzy, .greaterFuzzy: return true
|
||||||
|
default: return false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@inlinable var isEqual: Bool {
|
||||||
|
switch self {
|
||||||
|
case .equals, .fuzzyEquals, .greaterEqual, .lessEqual, .greaterFuzzy, .lessFuzzy: true
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@inlinable var isGreater: Bool {
|
||||||
|
switch self {
|
||||||
|
case .greater, .greaterEqual, .greaterFuzzy: true
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@inlinable var isLess: Bool {
|
||||||
|
switch self {
|
||||||
|
case .less, .lessEqual, .lessFuzzy: true
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extension ApkVersionSpecification.Operator: CustomStringConvertible {
|
extension ApkVersionSpecification.Operator: CustomStringConvertible {
|
||||||
|
@ -57,3 +57,16 @@ import Testing
|
|||||||
#expect(!ApkVersionCompare.validate(invalid), "Should be invalid: \(invalid)")
|
#expect(!ApkVersionCompare.validate(invalid), "Should be invalid: \(invalid)")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test func testVersionComparion() {
|
||||||
|
func test(_ spec: ApkVersionSpecification, _ version: String) -> Bool { spec.satisfied(by: version) }
|
||||||
|
#expect(test(.any(), "15.6-r0"))
|
||||||
|
#expect(test(.constraint(op: .equals, version: "15.6"), "15.6"))
|
||||||
|
#expect(test(.constraint(op: .fuzzyEquals, version: "15.6"), "15.6b"))
|
||||||
|
#expect(test(.constraint(op: .greaterEqual, version: "15.6"), "15.6"))
|
||||||
|
#expect(test(.constraint(op: .lessEqual, version: "15.6"), "15.6"))
|
||||||
|
#expect(!test(.constraint(op: .greater, version: "15.6"), "15.6"))
|
||||||
|
#expect(!test(.constraint(op: .less, version: "15.6"), "15.6"))
|
||||||
|
#expect(test(.constraint(op: .less, version: "15.6"), "14.7.6"))
|
||||||
|
#expect(test(.constraint(op: .greaterEqual, version: "13.7.6"), "15.6"))
|
||||||
|
}
|
||||||
|
Reference in New Issue
Block a user