Skip to content
Snippets Groups Projects
Commit 9f4d96bf authored by Dariusz Rybicki's avatar Dariusz Rybicki
Browse files

Implement CmixManager

parent 991e3c0f
No related branches found
No related tags found
2 merge requests!102Release 1.0.0,!18Update Bindings
import Bindings
public struct CmixManager {
public var hasStorage: CmixManagerHasStorage
public var create: CmixManagerCreate
public var load: CmixManagerLoad
public var remove: CmixManagerRemove
}
extension CmixManager {
public static func live(
directoryPath: String = FileManager.default
.urls(for: .applicationSupportDirectory, in: .userDomainMask)
.first!
.appendingPathComponent("xx.network.client")
.path,
fileManager: FileManager = .default,
environment: Environment = .mainnet,
downloadNDF: DownloadAndVerifySignedNdf = .live,
generateSecret: GenerateSecret = .live,
passwordStorage: PasswordStorage,
newCmix: NewCmix = .live,
getCmixParams: GetCmixParams = .liveDefault,
loadCmix: LoadCmix = .live
) -> CmixManager {
CmixManager(
hasStorage: .live(
directoryPath: directoryPath,
fileManager: fileManager
),
create: .live(
environment: environment,
downloadNDF: downloadNDF,
generateSecret: generateSecret,
passwordStorage: passwordStorage,
directoryPath: directoryPath,
fileManager: fileManager,
newCmix: newCmix,
getCmixParams: getCmixParams,
loadCmix: loadCmix
),
load: .live(
directoryPath: directoryPath,
passwordStorage: passwordStorage,
getCmixParams: getCmixParams,
loadCmix: loadCmix
),
remove: .live(
directoryPath: directoryPath,
fileManager: fileManager
)
)
}
}
extension CmixManager {
public static let unimplemented = CmixManager(
hasStorage: .unimplemented,
create: .unimplemented,
load: .unimplemented,
remove: .unimplemented
)
}
import Bindings
import XCTestDynamicOverlay
public struct CmixManagerCreate {
public var run: () throws -> Cmix
public func callAsFunction() throws -> Cmix {
try run()
}
}
extension CmixManagerCreate {
public static func live(
environment: Environment,
downloadNDF: DownloadAndVerifySignedNdf,
generateSecret: GenerateSecret,
passwordStorage: PasswordStorage,
directoryPath: String,
fileManager: FileManager,
newCmix: NewCmix,
getCmixParams: GetCmixParams,
loadCmix: LoadCmix
) -> CmixManagerCreate {
CmixManagerCreate {
let ndfData = try downloadNDF(environment)
let password = generateSecret()
try passwordStorage.save(password)
try? fileManager.removeItem(atPath: directoryPath)
try? fileManager.createDirectory(atPath: directoryPath, withIntermediateDirectories: true)
try newCmix(
ndfJSON: String(data: ndfData, encoding: .utf8)!,
storageDir: directoryPath,
password: password,
registrationCode: nil
)
return try loadCmix(
storageDir: directoryPath,
password: password,
cmixParamsJSON: getCmixParams()
)
}
}
}
extension CmixManagerCreate {
public static let unimplemented = CmixManagerCreate(
run: XCTUnimplemented("\(Self.self)")
)
}
import Bindings
import XCTestDynamicOverlay
public struct CmixManagerHasStorage {
public var run: () -> Bool
public func callAsFunction() -> Bool {
run()
}
}
extension CmixManagerHasStorage {
public static func live(
directoryPath: String,
fileManager: FileManager
) -> CmixManagerHasStorage {
CmixManagerHasStorage {
let contents = try? fileManager.contentsOfDirectory(atPath: directoryPath)
return contents.map { $0.isEmpty == false } ?? false
}
}
}
extension CmixManagerHasStorage {
public static let unimplemented = CmixManagerHasStorage(
run: XCTUnimplemented("\(Self.self)")
)
}
import Bindings
import XCTestDynamicOverlay
public struct CmixManagerLoad {
public var run: () throws -> Cmix
public func callAsFunction() throws -> Cmix {
try run()
}
}
extension CmixManagerLoad {
public static func live(
directoryPath: String,
passwordStorage: PasswordStorage,
getCmixParams: GetCmixParams,
loadCmix: LoadCmix
) -> CmixManagerLoad {
CmixManagerLoad {
try loadCmix(
storageDir: directoryPath,
password: passwordStorage.load(),
cmixParamsJSON: getCmixParams()
)
}
}
}
extension CmixManagerLoad {
public static let unimplemented = CmixManagerLoad(
run: XCTUnimplemented("\(Self.self)")
)
}
import Bindings
import XCTestDynamicOverlay
public struct CmixManagerRemove {
public var run: () throws -> Void
public func callAsFunction() throws {
try run()
}
}
extension CmixManagerRemove {
public static func live(
directoryPath: String,
fileManager: FileManager
) -> CmixManagerRemove {
CmixManagerRemove {
try fileManager.removeItem(atPath: directoryPath)
}
}
}
extension CmixManagerRemove {
public static let unimplemented = CmixManagerRemove(
run: XCTUnimplemented("\(Self.self)")
)
}
//import Bindings
//
//public struct ClientLoader {
// public var load: (URL, Data) throws -> Client
//
// public func callAsFunction(directoryURL: URL, password: Data) throws -> Client {
// try load(directoryURL, password)
// }
//}
//
//extension ClientLoader {
// public static let live = ClientLoader { directoryURL, password in
// var error: NSError?
// let bindingsClient = BindingsLogin(directoryURL.path, password, &error)
// if let error = error {
// throw error
// }
// guard let bindingsClient = bindingsClient else {
// fatalError("BindingsLogin returned `nil` without providing error")
// }
// return Client.live(bindingsClient: bindingsClient)
// }
//}
//
//#if DEBUG
//extension ClientLoader {
// public static let failing = ClientLoader { _, _ in
// struct NotImplemented: Error {}
// throw NotImplemented()
// }
//}
//#endif
//import Bindings
//
//public struct ClientStorage {
// public var hasStoredClient: () -> Bool
// public var createClient: () throws -> Client
// public var loadClient: () throws -> Client
// public var removeClient: () throws -> Void
//}
//
//extension ClientStorage {
// public static let defaultDirectoryURL = FileManager.default
// .urls(for: .applicationSupportDirectory, in: .userDomainMask)
// .first!
// .appendingPathComponent("xx.network.client")
//
// public static func live(
// environment: Environment = .mainnet,
// directoryURL: URL = defaultDirectoryURL,
// fileManager: FileManager = .default,
// generatePassword: PasswordGenerator = .live,
// passwordStorage: PasswordStorage,
// downloadNDF: NDFDownloader = .live,
// createClient: ClientCreator = .live,
// loadClient: ClientLoader = .live
// ) -> ClientStorage {
// ClientStorage(
// hasStoredClient: {
// let contents = try? fileManager.contentsOfDirectory(atPath: directoryURL.path)
// return contents.map { $0.isEmpty == false } ?? false
// },
// createClient: {
// let ndf = try downloadNDF(environment)
// let password = generatePassword()
// try passwordStorage.save(password)
// try? fileManager.removeItem(at: directoryURL)
// try? fileManager.createDirectory(at: directoryURL, withIntermediateDirectories: true)
// try createClient(directoryURL: directoryURL, ndf: ndf, password: password)
// return try loadClient(directoryURL: directoryURL, password: password)
// },
// loadClient: {
// let password = try passwordStorage.load()
// return try loadClient(directoryURL: directoryURL, password: password)
// },
// removeClient: {
// try fileManager.removeItem(at: directoryURL)
// }
// )
// }
//}
//
//#if DEBUG
//extension ClientStorage {
// public static let failing = ClientStorage(
// hasStoredClient: { false },
// createClient: {
// struct NotImplemented: Error {}
// throw NotImplemented()
// },
// loadClient: {
// struct NotImplemented: Error {}
// throw NotImplemented()
// },
// removeClient: {
// struct NotImplemented: Error {}
// throw NotImplemented()
// }
// )
//}
//#endif
import Foundation
import XCTestDynamicOverlay
public struct PasswordStorage {
public struct MissingPasswordError: Error, Equatable {
......@@ -17,17 +18,9 @@ public struct PasswordStorage {
public var load: () throws -> Data
}
#if DEBUG
extension PasswordStorage {
public static let failing = PasswordStorage(
save: { _ in
struct NotImplemented: Error {}
throw NotImplemented()
},
load: {
struct NotImplemented: Error {}
throw NotImplemented()
}
public static let unimplemented = PasswordStorage(
save: XCTUnimplemented("\(Self.self).save"),
load: XCTUnimplemented("\(Self.self).load")
)
}
#endif
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment