Skip to content
Snippets Groups Projects
MessengerEnvironment.swift 2.29 KiB
Newer Older
import Foundation
import XXClient
import XCTestDynamicOverlay

public struct MessengerEnvironment {
  public var ctx: MessengerContext
  public var downloadNDF: DownloadAndVerifySignedNdf
  public var fileManager: MessengerFileManager
  public var generateSecret: GenerateSecret
  public var getCMixParams: GetCMixParams
  public var getE2EParams: GetE2EParams
  public var isRegisteredWithUD: IsRegisteredWithUD
  public var loadCMix: LoadCMix
  public var login: Login
  public var ndfEnvironment: NDFEnvironment
  public var newCMix: NewCMix
  public var newOrLoadUd: NewOrLoadUd
  public var passwordStorage: PasswordStorage
  public var storageDir: () -> String
  public var udAddress: () -> String?
  public var udCert: () -> Data?
  public var udContact: () -> Data?
}

extension MessengerEnvironment {
  public static let defaultStorageDir = FileManager.default
    .urls(for: .applicationSupportDirectory, in: .userDomainMask)
    .first!
    .appendingPathComponent("xx.network.client")
    .path

  public static let live = MessengerEnvironment(
    ctx: .init(),
    downloadNDF: .live,
    fileManager: .live(),
    generateSecret: .live,
    getCMixParams: .liveDefault,
    getE2EParams: .liveDefault,
    isRegisteredWithUD: .live,
    loadCMix: .live,
    login: .live,
    ndfEnvironment: .mainnet,
    newCMix: .live,
    newOrLoadUd: .live,
    passwordStorage: .keychain,
    storageDir: { MessengerEnvironment.defaultStorageDir },
    udAddress: { nil },
    udCert: { nil },
    udContact: { nil }
  )
}

extension MessengerEnvironment {
  public static let unimplemented = MessengerEnvironment(
    ctx: .init(),
    downloadNDF: .unimplemented,
    fileManager: .unimplemented,
    generateSecret: .unimplemented,
    getCMixParams: .unimplemented,
    getE2EParams: .unimplemented,
    isRegisteredWithUD: .unimplemented,
    loadCMix: .unimplemented,
    login: .unimplemented,
    ndfEnvironment: .unimplemented,
    newCMix: .unimplemented,
    newOrLoadUd: .unimplemented,
    passwordStorage: .unimplemented,
    storageDir: XCTUnimplemented("\(Self.self).storageDir", placeholder: ""),
    udAddress: XCTUnimplemented("\(Self.self).udAddress", placeholder: nil),
    udCert: XCTUnimplemented("\(Self.self).udCert", placeholder: nil),
    udContact: XCTUnimplemented("\(Self.self).udContact", placeholder: nil)
  )
}