Created
May 14, 2019 06:09
-
-
Save Mintri1199/4d7e479b1544e15c0b57deb50672310c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
struct NetworkManager { | |
static let environment: NetworkEnvironment = .production | |
private let keywordRouter = Router<KeywordAPI>() | |
private let scryfallRouter = Router<ScryfallAPI>() | |
enum NetworkReponse: String { | |
case success | |
case authenticationError = "You need to be authenticated first." | |
case badRequest = "Bad Request" | |
case outdated = "The url you requested is outdated." | |
case failed = "Network request failed." | |
case noData = "Response returned with no data to decode." | |
case unableToDecode = "We could not decode the response." | |
} | |
enum Result<String> { | |
case success | |
case failure(String) | |
} | |
fileprivate func handleNetworkResponse(_ response: HTTPURLResponse) -> Result<String>{ | |
switch response.statusCode { | |
case 200...299: return .success | |
case 401...500: return .failure(NetworkReponse.authenticationError.rawValue) | |
case 501...599: return .failure(NetworkReponse.badRequest.rawValue) | |
case 600: return .failure(NetworkReponse.outdated.rawValue) | |
default: return .failure(NetworkReponse.failed.rawValue) | |
} | |
} | |
func getKeywords(completion: @escaping (_ keywords: [Keyword]?, _ error: String?) -> Void) { | |
keywordRouter.request(.keywords) { (data, response, error) in | |
if error != nil { | |
completion(nil, "Please Check your network connection") | |
} | |
if let response = response as? HTTPURLResponse { | |
let result = self.handleNetworkResponse(response) | |
switch result { | |
case .success: | |
guard let responseData = data else { completion(nil, NetworkReponse.noData.rawValue); return } | |
do { | |
let apiResponse = try JSONDecoder().decode([Keyword].self, from: responseData) | |
completion(apiResponse, nil) | |
} catch { | |
completion(nil, NetworkReponse.unableToDecode.rawValue) | |
} | |
case .failure(let networkFailureError): completion(nil, networkFailureError) | |
} | |
} | |
} | |
} | |
... | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment