1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116
|
//===----------------------------------------------------------------------===//
//
// This source file is part of the Swift open source project
//
// Copyright (c) 2014-2019 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See http://swift.org/LICENSE.txt for license information
// See http://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
import Basics
package final class MockArchiver: Archiver {
package typealias ExtractionHandler = (
MockArchiver,
AbsolutePath,
AbsolutePath,
(Result<Void, Error>) -> Void
) throws -> Void
package typealias CompressionHandler = (
MockArchiver,
AbsolutePath,
AbsolutePath,
(Result<Void, Error>) -> Void
) throws -> Void
package typealias ValidationHandler = (MockArchiver, AbsolutePath, (Result<Bool, Error>) -> Void) throws -> Void
package struct Extraction: Equatable {
public let archivePath: AbsolutePath
public let destinationPath: AbsolutePath
public init(archivePath: AbsolutePath, destinationPath: AbsolutePath) {
self.archivePath = archivePath
self.destinationPath = destinationPath
}
}
package struct Compression: Equatable {
public let directory: AbsolutePath
public let destinationPath: AbsolutePath
public init(directory: AbsolutePath, destinationPath: AbsolutePath) {
self.directory = directory
self.destinationPath = destinationPath
}
}
package let supportedExtensions: Set<String> = ["zip"]
package let extractions = ThreadSafeArrayStore<Extraction>()
package let compressions = ThreadSafeArrayStore<Compression>()
package let extractionHandler: ExtractionHandler?
package let compressionHandler: CompressionHandler?
package let validationHandler: ValidationHandler?
package convenience init(handler: ExtractionHandler? = .none) {
self.init(extractionHandler: handler, compressionHandler: .none, validationHandler: .none)
}
package init(
extractionHandler: ExtractionHandler? = .none,
compressionHandler: CompressionHandler? = .none,
validationHandler: ValidationHandler? = .none
) {
self.extractionHandler = extractionHandler
self.compressionHandler = compressionHandler
self.validationHandler = validationHandler
}
package func extract(
from archivePath: AbsolutePath,
to destinationPath: AbsolutePath,
completion: @escaping (Result<Void, Error>) -> Void
) {
do {
if let handler = self.extractionHandler {
try handler(self, archivePath, destinationPath, completion)
} else {
self.extractions.append(Extraction(archivePath: archivePath, destinationPath: destinationPath))
completion(.success(()))
}
} catch {
completion(.failure(error))
}
}
package func compress(
directory: AbsolutePath,
to destinationPath: AbsolutePath,
completion: @escaping (Result<Void, Error>) -> Void
) {
do {
if let handler = self.compressionHandler {
try handler(self, directory, destinationPath, completion)
} else {
self.compressions.append(Compression(directory: directory, destinationPath: destinationPath))
completion(.success(()))
}
} catch {
completion(.failure(error))
}
}
package func validate(path: AbsolutePath, completion: @escaping (Result<Bool, Error>) -> Void) {
do {
if let handler = self.validationHandler {
try handler(self, path, completion)
} else {
completion(.success(true))
}
} catch {
completion(.failure(error))
}
}
}
|