Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -33,15 +33,15 @@ protocol JSONEncodable {
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} class Response<T> {
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} let statusCode: Int
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} let header: [String: String]
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} let body: T?
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} let body: T

{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} init(statusCode: Int, header: [String: String], body: T?) {
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} init(statusCode: Int, header: [String: String], body: T) {
self.statusCode = statusCode
self.header = header
self.body = body
}

{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} convenience init(response: HTTPURLResponse, body: T?) {
{{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}public{{/nonPublicApi}} convenience init(response: HTTPURLResponse, body: T) {
let rawHeader = response.allHeaderFields
var header = [String: String]()
for (key, value) in rawHeader {
Expand Down
10 changes: 5 additions & 5 deletions modules/openapi-generator/src/main/resources/swift5/api.mustache
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,7 @@ extension {{projectName}}API {
switch result {
{{#returnType}}
case let .success(response):
deferred.resolver.fulfill(response.body!)
deferred.resolver.fulfill(response.body)
{{/returnType}}
{{^returnType}}
case .success:
Expand Down Expand Up @@ -128,7 +128,7 @@ extension {{projectName}}API {
switch result {
{{#returnType}}
case let .success(response):
observer.onNext(response.body!)
observer.onNext(response.body)
{{/returnType}}
{{^returnType}}
case .success:
Expand Down Expand Up @@ -167,7 +167,7 @@ extension {{projectName}}API {
switch result {
{{#returnType}}
case let .success(response):
promise(.success(response.body!))
promise(.success(response.body))

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@funzin please search and replace all occurrences of response.body! with response.body in this class, to fix all the cases. Thanks

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I have already checked response.body! in swift5
dbdc585

Maybe, CI will be succeed.

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@4brunu
CI ✅

{{/returnType}}
{{^returnType}}
case .success:
Expand Down Expand Up @@ -212,7 +212,7 @@ extension {{projectName}}API {
switch result {
{{#returnType}}
case let .success(response):
continuation.resume(returning: response.body!)
continuation.resume(returning: response.body)
{{/returnType}}
{{^returnType}}
case .success:
Expand Down Expand Up @@ -246,7 +246,7 @@ extension {{projectName}}API {
switch result {
{{#returnType}}
case let .success(response):
completion(.success(response.body!))
completion(.success(response.body))
{{/returnType}}
{{^returnType}}
case .success:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -160,100 +160,20 @@ private var managerStore = SynchronizedDictionary<String, Alamofire.Session>()
let validatedRequest = request.validate()

switch T.self {
case is String.Type:

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

When response type is void, getNonDecodableBuilder is used

  • let localVariableRequestBuilder: RequestBuilder<{{{returnType}}}{{^returnType}}Void{{/returnType}}>.Type = {{projectName}}API.requestBuilderFactory.{{#returnType}}getBuilder(){{/returnType}}{{^returnType}}getNonDecodableBuilder(){{/returnType}}
  • {{#nonPublicApi}}internal{{/nonPublicApi}}{{^nonPublicApi}}open{{/nonPublicApi}} class func {{operationId}}({{#allParams}}{{paramName}}: {{#isEnum}}{{#isContainer}}{{{dataType}}}{{/isContainer}}{{^isContainer}}{{{datatypeWithEnum}}}_{{operationId}}{{/isContainer}}{{/isEnum}}{{^isEnum}}{{{dataType}}}{{/isEnum}}{{^required}}? = nil{{/required}}{{^-last}}, {{/-last}}{{/allParams}}{{#hasParams}}, {{/hasParams}}apiResponseQueue: DispatchQueue = {{projectName}}API.apiResponseQueue) -> AnyPublisher<{{{returnType}}}{{^returnType}}Void{{/returnType}}, Error> {

validatedRequest.responseString(queue: apiResponseQueue, completionHandler: { stringResponse in
cleanupRequest()

switch stringResponse.result {
case let .success(value):
completion(.success(Response(response: stringResponse.response!, body: value as? T)))
case let .failure(error):
completion(.failure(ErrorResponse.error(stringResponse.response?.statusCode ?? 500, stringResponse.data, stringResponse.response, error)))
}

})
case is URL.Type:
validatedRequest.responseData(queue: apiResponseQueue, completionHandler: { dataResponse in
cleanupRequest()

do {

guard case .success = dataResponse.result else {
throw DownloadException.responseFailed
}

guard let data = dataResponse.data else {
throw DownloadException.responseDataMissing
}

guard let request = request.request else {
throw DownloadException.requestMissing
}

let fileManager = FileManager.default
let urlRequest = try request.asURLRequest()
let cachesDirectory = fileManager.urls(for: .cachesDirectory, in: .userDomainMask)[0]
let requestURL = try self.getURL(from: urlRequest)

var requestPath = try self.getPath(from: requestURL)

if let headerFileName = self.getFileName(fromContentDisposition: dataResponse.response?.allHeaderFields["Content-Disposition"] as? String) {
requestPath = requestPath.appending("/\(headerFileName)")
} else {
requestPath = requestPath.appending("/tmp.{{projectName}}.\(UUID().uuidString)")
}

let filePath = cachesDirectory.appendingPathComponent(requestPath)
let directoryPath = filePath.deletingLastPathComponent().path

try fileManager.createDirectory(atPath: directoryPath, withIntermediateDirectories: true, attributes: nil)
try data.write(to: filePath, options: .atomic)

completion(.success(Response(response: dataResponse.response!, body: filePath as? T)))

} catch let requestParserError as DownloadException {
completion(.failure(ErrorResponse.error(400, dataResponse.data, dataResponse.response, requestParserError)))
} catch {
completion(.failure(ErrorResponse.error(400, dataResponse.data, dataResponse.response, error)))
}
return
})
case is Void.Type:
validatedRequest.responseData(queue: apiResponseQueue, completionHandler: { voidResponse in
cleanupRequest()

switch voidResponse.result {
case .success:
completion(.success(Response(response: voidResponse.response!, body: nil)))
completion(.success(Response(response: voidResponse.response!, body: () as! T)))
case let .failure(error):
completion(.failure(ErrorResponse.error(voidResponse.response?.statusCode ?? 500, voidResponse.data, voidResponse.response, error)))
}

})
case is Data.Type:
validatedRequest.responseData(queue: apiResponseQueue, completionHandler: { dataResponse in
cleanupRequest()

switch dataResponse.result {
case .success:
completion(.success(Response(response: dataResponse.response!, body: dataResponse.data as? T)))
case let .failure(error):
completion(.failure(ErrorResponse.error(dataResponse.response?.statusCode ?? 500, dataResponse.data, dataResponse.response, error)))
}

})
default:
validatedRequest.responseData(queue: apiResponseQueue, completionHandler: { dataResponse in
cleanupRequest()

switch dataResponse.result {
case .success:
completion(.success(Response(response: dataResponse.response!, body: dataResponse.data as? T)))
case let .failure(error):
completion(.failure(ErrorResponse.error(dataResponse.response?.statusCode ?? 500, dataResponse.data, dataResponse.response, error)))
}

})
fatalError("Unsupported Response Body Type - \(String(describing: T.self))")
}
}

Expand Down Expand Up @@ -338,7 +258,7 @@ private var managerStore = SynchronizedDictionary<String, Alamofire.Session>()

switch stringResponse.result {
case let .success(value):
completion(.success(Response(response: stringResponse.response!, body: value as? T)))
completion(.success(Response(response: stringResponse.response!, body: value as! T)))
case let .failure(error):
completion(.failure(ErrorResponse.error(stringResponse.response?.statusCode ?? 500, stringResponse.data, stringResponse.response, error)))
}
Expand Down Expand Up @@ -381,7 +301,7 @@ private var managerStore = SynchronizedDictionary<String, Alamofire.Session>()
try fileManager.createDirectory(atPath: directoryPath, withIntermediateDirectories: true, attributes: nil)
try data.write(to: filePath, options: .atomic)

completion(.success(Response(response: dataResponse.response!, body: filePath as? T)))
completion(.success(Response(response: dataResponse.response!, body: filePath as! T)))

} catch let requestParserError as DownloadException {
completion(.failure(ErrorResponse.error(400, dataResponse.data, dataResponse.response, requestParserError)))
Expand All @@ -396,7 +316,7 @@ private var managerStore = SynchronizedDictionary<String, Alamofire.Session>()

switch voidResponse.result {
case .success:
completion(.success(Response(response: voidResponse.response!, body: nil)))
completion(.success(Response(response: voidResponse.response!, body: () as! T)))
case let .failure(error):
completion(.failure(ErrorResponse.error(voidResponse.response?.statusCode ?? 500, voidResponse.data, voidResponse.response, error)))
}
Expand All @@ -408,7 +328,7 @@ private var managerStore = SynchronizedDictionary<String, Alamofire.Session>()

switch dataResponse.result {
case .success:
completion(.success(Response(response: dataResponse.response!, body: dataResponse.data as? T)))
completion(.success(Response(response: dataResponse.response!, body: dataResponse.data as! T)))
case let .failure(error):
completion(.failure(ErrorResponse.error(dataResponse.response?.statusCode ?? 500, dataResponse.data, dataResponse.response, error)))
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -200,60 +200,12 @@ private var credentialStore = SynchronizedDictionary<Int, URLCredential>()
}

switch T.self {
case is String.Type:

let body = data.flatMap { String(data: $0, encoding: .utf8) } ?? ""

completion(.success(Response<T>(response: httpResponse, body: body as? T)))

case is URL.Type:
do {

guard error == nil else {
throw DownloadException.responseFailed
}

guard let data = data else {
throw DownloadException.responseDataMissing
}

let fileManager = FileManager.default
let cachesDirectory = fileManager.urls(for: .cachesDirectory, in: .userDomainMask)[0]
let requestURL = try getURL(from: urlRequest)

var requestPath = try getPath(from: requestURL)

if let headerFileName = getFileName(fromContentDisposition: httpResponse.allHeaderFields["Content-Disposition"] as? String) {
requestPath = requestPath.appending("/\(headerFileName)")
} else {
requestPath = requestPath.appending("/tmp.{{projectName}}.\(UUID().uuidString)")
}

let filePath = cachesDirectory.appendingPathComponent(requestPath)
let directoryPath = filePath.deletingLastPathComponent().path

try fileManager.createDirectory(atPath: directoryPath, withIntermediateDirectories: true, attributes: nil)
try data.write(to: filePath, options: .atomic)

completion(.success(Response(response: httpResponse, body: filePath as? T)))

} catch let requestParserError as DownloadException {
completion(.failure(ErrorResponse.error(400, data, response, requestParserError)))
} catch {
completion(.failure(ErrorResponse.error(400, data, response, error)))
}

case is Void.Type:

completion(.success(Response(response: httpResponse, body: nil)))

case is Data.Type:

completion(.success(Response(response: httpResponse, body: data as? T)))
completion(.success(Response(response: httpResponse, body: () as! T)))

default:

completion(.success(Response(response: httpResponse, body: data as? T)))
fatalError("Unsupported Response Body Type - \(String(describing: T.self))")
}

}
Expand Down Expand Up @@ -345,7 +297,7 @@ private var credentialStore = SynchronizedDictionary<Int, URLCredential>()

let body = data.flatMap { String(data: $0, encoding: .utf8) } ?? ""

completion(.success(Response<T>(response: httpResponse, body: body as? T)))
completion(.success(Response<T>(response: httpResponse, body: body as! T)))

case is URL.Type:
do {
Expand Down Expand Up @@ -376,7 +328,7 @@ private var credentialStore = SynchronizedDictionary<Int, URLCredential>()
try fileManager.createDirectory(atPath: directoryPath, withIntermediateDirectories: true, attributes: nil)
try data.write(to: filePath, options: .atomic)

completion(.success(Response(response: httpResponse, body: filePath as? T)))
completion(.success(Response(response: httpResponse, body: filePath as! T)))

} catch let requestParserError as DownloadException {
completion(.failure(ErrorResponse.error(400, data, response, requestParserError)))
Expand All @@ -386,11 +338,11 @@ private var credentialStore = SynchronizedDictionary<Int, URLCredential>()

case is Void.Type:

completion(.success(Response(response: httpResponse, body: nil)))
completion(.success(Response(response: httpResponse, body: () as! T)))

case is Data.Type:

completion(.success(Response(response: httpResponse, body: data as? T)))
completion(.success(Response(response: httpResponse, body: data as! T)))

default:

Expand Down
Loading