mirror of
				https://github.com/GayPizzaSpecifications/darwin-apk.git
				synced 2025-11-04 07:59:38 +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