mirror of
https://github.com/GayPizzaSpecifications/darwin-apk.git
synced 2025-08-03 21:41:31 +00:00
try implementing a command that can search the index for packages
This commit is contained in:
45
Sources/apk/Index/ApkIndexReading.swift
Normal file
45
Sources/apk/Index/ApkIndexReading.swift
Normal file
@ -0,0 +1,45 @@
|
||||
/*
|
||||
* darwin-apk © 2024 Gay Pizza Specifications
|
||||
* SPDX-License-Identifier: Apache-2.0
|
||||
*/
|
||||
|
||||
import Foundation
|
||||
|
||||
public extension ApkIndex {
|
||||
init(readFrom indexURL: URL) throws {
|
||||
let file = try FileInputStream(indexURL)
|
||||
var gzip = GZipReader()
|
||||
var tarRecords = [TarReader.Entry]()
|
||||
for tarData in try (0..<2).map({ _ in try gzip.read(inStream: file) }) {
|
||||
let tarStream = MemoryInputStream(buffer: tarData)
|
||||
tarRecords += try TarReader.read(tarStream)
|
||||
}
|
||||
|
||||
guard case .file(let signatureName, _) = tarRecords.first else {
|
||||
throw ApkIndexReadingError.missingSignature
|
||||
}
|
||||
guard let apkIndexFile = tarRecords.firstFile(name: "APKINDEX") else {
|
||||
throw ApkIndexReadingError.missingIndex
|
||||
}
|
||||
guard let description = tarRecords.firstFile(name: "DESCRIPTION") else {
|
||||
throw ApkIndexReadingError.missingDescription
|
||||
}
|
||||
|
||||
try self.init(raw:
|
||||
try ApkRawIndex(lines: MemoryInputStream(buffer: apkIndexFile).lines))
|
||||
}
|
||||
}
|
||||
|
||||
public enum ApkIndexReadingError: Error, LocalizedError {
|
||||
case missingSignature
|
||||
case missingIndex
|
||||
case missingDescription
|
||||
|
||||
public var errorDescription: String? {
|
||||
switch self {
|
||||
case .missingSignature: "Missing signature"
|
||||
case .missingIndex: "APKINDEX missing"
|
||||
case .missingDescription: "DESCRIPTION missing"
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user