mirror of
				https://github.com/GayPizzaSpecifications/darwin-apk.git
				synced 2025-11-03 15:49:37 +00:00 
			
		
		
		
	Resolve providers correctly
This commit is contained in:
		@ -1,5 +1,5 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * darwin-apk © 2024 Gay Pizza Specifications
 | 
					 * darwin-apk © 2024, 2025 Gay Pizza Specifications
 | 
				
			||||||
 * SPDX-License-Identifier: Apache-2.0
 | 
					 * SPDX-License-Identifier: Apache-2.0
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -25,21 +25,15 @@ public extension ApkIndex {
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
  func resolve(requirement: ApkVersionRequirement) -> ApkIndexPackage? {
 | 
					  func resolve(requirement: ApkVersionRequirement) -> ApkIndexPackage? {
 | 
				
			||||||
    self.packages.first { pkg in
 | 
					    self.packages.first { pkg in
 | 
				
			||||||
      guard pkg.name == requirement.name ||
 | 
					      return (pkg.name == requirement.name && requirement.versionSpec.satisfied(by: pkg.version))
 | 
				
			||||||
          pkg.provides.contains(where: { $0.name == requirement.name }) else {
 | 
					        || pkg.provides.contains(where: { $0.satisfies(requirement) })
 | 
				
			||||||
        return false
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      return requirement.versionSpec.satisfied(by: pkg.version)
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
  func resolveIndex(requirement: ApkVersionRequirement) -> Index? {
 | 
					  func resolveIndex(requirement: ApkVersionRequirement) -> Index? {
 | 
				
			||||||
    self.packages.firstIndex { pkg in
 | 
					    self.packages.firstIndex { pkg in
 | 
				
			||||||
      guard pkg.name == requirement.name ||
 | 
					      return (pkg.name == requirement.name && requirement.versionSpec.satisfied(by: pkg.version))
 | 
				
			||||||
          pkg.provides.contains(where: { $0.name == requirement.name }) else {
 | 
					        || pkg.provides.contains(where: { $0.satisfies(requirement) })
 | 
				
			||||||
        return false
 | 
					 | 
				
			||||||
      }
 | 
					 | 
				
			||||||
      return requirement.versionSpec.satisfied(by: pkg.version)
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
@ -93,7 +93,7 @@ extension ApkIndexPackage {
 | 
				
			|||||||
      case "p":
 | 
					      case "p":
 | 
				
			||||||
        do {
 | 
					        do {
 | 
				
			||||||
          provides = try record.value.split(separator: " ")
 | 
					          provides = try record.value.split(separator: " ")
 | 
				
			||||||
            .map { .init(requirement: try .init(extract: $0)) }
 | 
					            .map { try .init(requirement: try .init(extract: $0)) }
 | 
				
			||||||
        } catch { throw .badValue(key: record.key, cause: error.localizedDescription) }
 | 
					        } catch { throw .badValue(key: record.key, cause: error.localizedDescription) }
 | 
				
			||||||
      case "i":
 | 
					      case "i":
 | 
				
			||||||
        do {
 | 
					        do {
 | 
				
			||||||
@ -207,7 +207,7 @@ extension ApkIndexPackage: CustomStringConvertible {
 | 
				
			|||||||
    s += "dependencies: - \(self.dependencies.map(\.requirement.description).joined(separator: " "))\n"
 | 
					    s += "dependencies: - \(self.dependencies.map(\.requirement.description).joined(separator: " "))\n"
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if !self.provides.isEmpty {
 | 
					    if !self.provides.isEmpty {
 | 
				
			||||||
    s += "provides: ----- \(self.provides.map(\.name).joined(separator: " "))\n"
 | 
					    s += "provides: ----- \(self.provides.map(\.description).joined(separator: " "))\n"
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    if !self.installIf.isEmpty {
 | 
					    if !self.installIf.isEmpty {
 | 
				
			||||||
    s += "install if: --- \(self.installIf.map(\.requirement.description).joined(separator: " "))\n"
 | 
					    s += "install if: --- \(self.installIf.map(\.requirement.description).joined(separator: " "))\n"
 | 
				
			||||||
 | 
				
			|||||||
@ -1,12 +1,60 @@
 | 
				
			|||||||
/*
 | 
					/*
 | 
				
			||||||
 * darwin-apk © 2024 Gay Pizza Specifications
 | 
					 * darwin-apk © 2024, 2025 Gay Pizza Specifications
 | 
				
			||||||
 * SPDX-License-Identifier: Apache-2.0
 | 
					 * SPDX-License-Identifier: Apache-2.0
 | 
				
			||||||
 */
 | 
					 */
 | 
				
			||||||
 | 
					
 | 
				
			||||||
public struct ApkIndexProvides: Hashable, Sendable {
 | 
					import Foundation
 | 
				
			||||||
  let name: String
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
  init(requirement: ApkVersionRequirement) {
 | 
					public enum ApkIndexProvides: Hashable, Sendable {
 | 
				
			||||||
    self.name = requirement.name
 | 
					  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
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
  }
 | 
					  }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user