Advertisement
Guest User

Untitled

a guest
Sep 9th, 2017
141
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.04 KB | None | 0 0
  1. //: Domain
  2.  
  3. struct User {
  4. let firstName: String
  5. let lastName: String
  6. }
  7.  
  8. struct LoginUseCase {
  9. enum Error: Swift.Error {
  10. case invalidCredentials
  11. case invalidResponse
  12. }
  13.  
  14. struct Request {
  15. let username: String
  16. let password: String
  17. }
  18.  
  19. struct Response {
  20. let user: User
  21. }
  22.  
  23. enum Result {
  24. case success(Response)
  25. case failure(Error)
  26. }
  27.  
  28. let repository: LoginRepositoryType
  29.  
  30. func login(with request: Request, completion: @escaping (Result) -> ()) {
  31. repository.login(with: request.username, password: request.password, completion: { (user, error) in
  32. guard let user = user else {
  33. guard let error = error as? Error else {
  34. completion(Result.failure(.invalidResponse))
  35. return
  36. }
  37. completion(Result.failure(error))
  38. return
  39. }
  40. completion(Result.success(.init(user: user)))
  41. })
  42. }
  43. }
  44.  
  45. protocol LoginUseCaseProviderType {
  46. func makeLoginUseCase() -> LoginUseCase
  47. }
  48.  
  49. protocol LoginRepositoryType {
  50. func login(with username: String, password: String, completion: @escaping (User?, Error?) -> ())
  51. }
  52.  
  53. //: Platform
  54.  
  55. protocol NetworkType { }
  56. struct Network: NetworkType { }
  57.  
  58. protocol LoginStorageType { }
  59. struct LoginStorage: LoginStorageType { }
  60.  
  61. struct LoginUseCaseProvider: LoginUseCaseProviderType {
  62. let repository: LoginRepositoryType
  63.  
  64. func makeLoginUseCase() -> LoginUseCase {
  65. return LoginUseCase(repository: repository)
  66. }
  67. }
  68.  
  69. struct LoginRepository: LoginRepositoryType {
  70. private let network: NetworkType
  71. private let storage: LoginStorageType
  72.  
  73. init(network: NetworkType, storage: LoginStorageType) {
  74. self.network = network
  75. self.storage = storage
  76. }
  77.  
  78. func login(with username: String, password: String, completion: @escaping (User?, Error?) -> ()) {
  79. completion(User(firstName: "first", lastName: "last"), nil)
  80. }
  81. }
  82.  
  83. protocol LoginRepositoryProviderType {
  84. func makeRepository() -> LoginRepositoryType
  85. }
  86.  
  87. struct LoginRepositoryProvider: LoginRepositoryProviderType {
  88. private let network: NetworkType
  89. private let storage: LoginStorageType
  90.  
  91. init(network: NetworkType, storage: LoginStorageType) {
  92. self.network = network
  93. self.storage = storage
  94. }
  95.  
  96. func makeRepository() -> LoginRepositoryType {
  97. return LoginRepository(network: network, storage: storage)
  98. }
  99. }
  100.  
  101. struct RepositoryProvider {
  102. let loginRepositoryProvider: LoginRepositoryProviderType
  103.  
  104. init() {
  105. loginRepositoryProvider = LoginRepositoryProvider(network: Network(), storage: LoginStorage())
  106. }
  107. }
  108.  
  109. struct ServiceProvider {
  110. let loginUseCaseProvider: LoginUseCaseProviderType
  111.  
  112. init(repositoryProvider: RepositoryProvider) {
  113. self.loginUseCaseProvider = LoginUseCaseProvider(repository: repositoryProvider.loginRepositoryProvider.makeRepository())
  114. }
  115. }
  116.  
  117.  
  118. let repositoryProvider = RepositoryProvider()
  119. let serviceProvider = ServiceProvider(repositoryProvider: repositoryProvider)
  120. let useCase = serviceProvider.loginUseCaseProvider.makeLoginUseCase()
  121.  
  122. let request = LoginUseCase.Request(username: "username", password: "password")
  123.  
  124. useCase.login(with: request) { (result) in
  125. switch result {
  126. case let .failure(error):
  127. print(error)
  128. case let .success(user):
  129. print(user)
  130. }
  131. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement