Skip to content

Commit

Permalink
Add Request encoder (#203)
Browse files Browse the repository at this point in the history
Add Request encoder
  • Loading branch information
yonaskolb authored Nov 19, 2019
2 parents d1d6a22 + 6589f8a commit defe317
Show file tree
Hide file tree
Showing 52 changed files with 176 additions and 169 deletions.
4 changes: 2 additions & 2 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@

### Added
- Added ability to set nested template options from the command line using dot syntax eg `--option "typeAliases.ID: String"` #189
- Added support for changing default JSON encoder #172
- Added support for using a custom JSON encoder per request #172
- Added a customizable `jsonEncoder` on APIClient #172 #203
- Added support for using a custom encoder per request #172 #203

### Changes
- List operations by path and then by method to keep the order consistent between code generations #185
Expand Down
8 changes: 0 additions & 8 deletions Specs/Petstore/generated/Swift/Sources/API.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,6 @@ public struct Petstore {
/// Used to encode Dates when uses as string params
public static var dateEncodingFormatter = DateFormatter(formatString: "yyyy-MM-dd'T'HH:mm:ssZZZZZ")

/// Default JSONEncoder used to enconde each API request
public static var defaultJSONEncoder: JSONEncoder {
let jsonEncoder = JSONEncoder()
jsonEncoder.dateEncodingStrategy = .formatted(Petstore.dateEncodingFormatter)

return jsonEncoder
}

public static let version = "1.0.0"

public enum Pets {}
Expand Down
8 changes: 5 additions & 3 deletions Specs/Petstore/generated/Swift/Sources/APIClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ public class APIClient {
public var defaultHeaders: [String: String]

public var jsonDecoder = JSONDecoder()
public var jsonEncoder = JSONEncoder()

public var decodingQueue = DispatchQueue(label: "apiClient", qos: .utility, attributes: .concurrent)

Expand All @@ -33,6 +34,7 @@ public class APIClient {
self.behaviours = behaviours
self.defaultHeaders = defaultHeaders
jsonDecoder.dateDecodingStrategy = .custom(dateDecoder)
jsonEncoder.dateEncodingStrategy = .formatted(Petstore.dateEncodingFormatter)
}

/// Makes a network request
Expand All @@ -51,7 +53,7 @@ public class APIClient {
// create the url request from the request
var urlRequest: URLRequest
do {
urlRequest = try request.createURLRequest(baseURL: baseURL)
urlRequest = try request.createURLRequest(baseURL: baseURL, encoder: jsonEncoder)
} catch {
let error = APIClientError.requestEncodingError(error)
requestBehaviour.onFailure(error: error)
Expand Down Expand Up @@ -213,7 +215,7 @@ extension APIRequest {
extension APIRequest {

/// pass in an optional baseURL, otherwise URLRequest.url will be relative
public func createURLRequest(baseURL: String = "") throws -> URLRequest {
public func createURLRequest(baseURL: String = "", encoder: RequestEncoder = JSONEncoder()) throws -> URLRequest {
let url = URL(string: "\(baseURL)\(path)")!
var urlRequest = URLRequest(url: url)
urlRequest.httpMethod = service.method
Expand All @@ -240,7 +242,7 @@ extension APIRequest {
urlRequest = try URLEncoding.httpBody.encode(urlRequest, with: formParams)
}
if let encodeBody = encodeBody {
urlRequest.httpBody = try encodeBody()
urlRequest.httpBody = try encodeBody(encoder)
urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
}
return urlRequest
Expand Down
6 changes: 3 additions & 3 deletions Specs/Petstore/generated/Swift/Sources/APIRequest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public class APIRequest<ResponseType: APIResponseValue> {
public let service: APIService<ResponseType>
public private(set) var queryParameters: [String: Any]
public private(set) var formParameters: [String: Any]
public let encodeBody: (() throws -> Data)?
public let encodeBody: ((RequestEncoder) throws -> Data)?
private(set) var headerParameters: [String: String]
public var customHeaders: [String: String] = [:]

Expand All @@ -26,7 +26,7 @@ public class APIRequest<ResponseType: APIResponseValue> {
queryParameters: [String: Any] = [:],
formParameters: [String: Any] = [:],
headers: [String: String] = [:],
encodeBody: (() throws -> Data)? = nil) {
encodeBody: ((RequestEncoder) throws -> Data)? = nil) {
self.service = service
self.queryParameters = queryParameters
self.formParameters = formParameters
Expand All @@ -51,7 +51,7 @@ extension APIRequest: CustomDebugStringConvertible {
public var debugDescription: String {
var string = description
if let encodeBody = encodeBody,
let data = try? encodeBody(),
let data = try? encodeBody(JSONEncoder()),
let bodyString = String(data: data, encoding: .utf8) {
string += "\nbody: \(bodyString)"
}
Expand Down
7 changes: 7 additions & 0 deletions Specs/Petstore/generated/Swift/Sources/Coding.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,13 @@ public protocol ResponseDecoder {

extension JSONDecoder: ResponseDecoder {}

public protocol RequestEncoder {

func encode<T: Encodable>(_ value: T) throws -> Data
}

extension JSONEncoder: RequestEncoder {}

extension APIModel {
func encode() -> [String: Any] {
guard
Expand Down
8 changes: 0 additions & 8 deletions Specs/PetstoreTest/generated/Swift/Sources/API.swift
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,6 @@ public struct PetstoreTest {
/// Used to encode Dates when uses as string params
public static var dateEncodingFormatter = DateFormatter(formatString: "yyyy-MM-dd'T'HH:mm:ssZZZZZ")

/// Default JSONEncoder used to enconde each API request
public static var defaultJSONEncoder: JSONEncoder {
let jsonEncoder = JSONEncoder()
jsonEncoder.dateEncodingStrategy = .formatted(PetstoreTest.dateEncodingFormatter)

return jsonEncoder
}

public static let version = "1.0.0"

public enum Fake {}
Expand Down
8 changes: 5 additions & 3 deletions Specs/PetstoreTest/generated/Swift/Sources/APIClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ public class APIClient {
public var defaultHeaders: [String: String]

public var jsonDecoder = JSONDecoder()
public var jsonEncoder = JSONEncoder()

public var decodingQueue = DispatchQueue(label: "apiClient", qos: .utility, attributes: .concurrent)

Expand All @@ -33,6 +34,7 @@ public class APIClient {
self.behaviours = behaviours
self.defaultHeaders = defaultHeaders
jsonDecoder.dateDecodingStrategy = .custom(dateDecoder)
jsonEncoder.dateEncodingStrategy = .formatted(PetstoreTest.dateEncodingFormatter)
}

/// Makes a network request
Expand All @@ -51,7 +53,7 @@ public class APIClient {
// create the url request from the request
var urlRequest: URLRequest
do {
urlRequest = try request.createURLRequest(baseURL: baseURL)
urlRequest = try request.createURLRequest(baseURL: baseURL, encoder: jsonEncoder)
} catch {
let error = APIClientError.requestEncodingError(error)
requestBehaviour.onFailure(error: error)
Expand Down Expand Up @@ -213,7 +215,7 @@ extension APIRequest {
extension APIRequest {

/// pass in an optional baseURL, otherwise URLRequest.url will be relative
public func createURLRequest(baseURL: String = "") throws -> URLRequest {
public func createURLRequest(baseURL: String = "", encoder: RequestEncoder = JSONEncoder()) throws -> URLRequest {
let url = URL(string: "\(baseURL)\(path)")!
var urlRequest = URLRequest(url: url)
urlRequest.httpMethod = service.method
Expand All @@ -240,7 +242,7 @@ extension APIRequest {
urlRequest = try URLEncoding.httpBody.encode(urlRequest, with: formParams)
}
if let encodeBody = encodeBody {
urlRequest.httpBody = try encodeBody()
urlRequest.httpBody = try encodeBody(encoder)
urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
}
return urlRequest
Expand Down
6 changes: 3 additions & 3 deletions Specs/PetstoreTest/generated/Swift/Sources/APIRequest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ public class APIRequest<ResponseType: APIResponseValue> {
public let service: APIService<ResponseType>
public private(set) var queryParameters: [String: Any]
public private(set) var formParameters: [String: Any]
public let encodeBody: (() throws -> Data)?
public let encodeBody: ((RequestEncoder) throws -> Data)?
private(set) var headerParameters: [String: String]
public var customHeaders: [String: String] = [:]

Expand All @@ -26,7 +26,7 @@ public class APIRequest<ResponseType: APIResponseValue> {
queryParameters: [String: Any] = [:],
formParameters: [String: Any] = [:],
headers: [String: String] = [:],
encodeBody: (() throws -> Data)? = nil) {
encodeBody: ((RequestEncoder) throws -> Data)? = nil) {
self.service = service
self.queryParameters = queryParameters
self.formParameters = formParameters
Expand All @@ -51,7 +51,7 @@ extension APIRequest: CustomDebugStringConvertible {
public var debugDescription: String {
var string = description
if let encodeBody = encodeBody,
let data = try? encodeBody(),
let data = try? encodeBody(JSONEncoder()),
let bodyString = String(data: data, encoding: .utf8) {
string += "\nbody: \(bodyString)"
}
Expand Down
7 changes: 7 additions & 0 deletions Specs/PetstoreTest/generated/Swift/Sources/Coding.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,13 @@ public protocol ResponseDecoder {

extension JSONDecoder: ResponseDecoder {}

public protocol RequestEncoder {

func encode<T: Encodable>(_ value: T) throws -> Data
}

extension JSONEncoder: RequestEncoder {}

extension APIModel {
func encode() -> [String: Any] {
guard
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ extension PetstoreTest.Fake {

public var body: Client

public init(body: Client, jsonEncoder: JSONEncoder = PetstoreTest.defaultJSONEncoder) {
public init(body: Client, encoder: RequestEncoder? = nil) {
self.body = body
super.init(service: TestClientModel.service) {
return try jsonEncoder.encode(body)
super.init(service: TestClientModel.service) { defaultEncoder in
return try (encoder ?? defaultEncoder).encode(body)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ extension PetstoreTest.Pet {

public var body: Pet

public init(body: Pet, jsonEncoder: JSONEncoder = PetstoreTest.defaultJSONEncoder) {
public init(body: Pet, encoder: RequestEncoder? = nil) {
self.body = body
super.init(service: AddPet.service) {
return try jsonEncoder.encode(body)
super.init(service: AddPet.service) { defaultEncoder in
return try (encoder ?? defaultEncoder).encode(body)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ extension PetstoreTest.Pet {

public var body: Pet

public init(body: Pet, jsonEncoder: JSONEncoder = PetstoreTest.defaultJSONEncoder) {
public init(body: Pet, encoder: RequestEncoder? = nil) {
self.body = body
super.init(service: UpdatePet.service) {
return try jsonEncoder.encode(body)
super.init(service: UpdatePet.service) { defaultEncoder in
return try (encoder ?? defaultEncoder).encode(body)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ extension PetstoreTest.Store {

public var body: Order

public init(body: Order, jsonEncoder: JSONEncoder = PetstoreTest.defaultJSONEncoder) {
public init(body: Order, encoder: RequestEncoder? = nil) {
self.body = body
super.init(service: PlaceOrder.service) {
return try jsonEncoder.encode(body)
super.init(service: PlaceOrder.service) { defaultEncoder in
return try (encoder ?? defaultEncoder).encode(body)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ extension PetstoreTest.User {

public var body: User

public init(body: User, jsonEncoder: JSONEncoder = PetstoreTest.defaultJSONEncoder) {
public init(body: User, encoder: RequestEncoder? = nil) {
self.body = body
super.init(service: CreateUser.service) {
return try jsonEncoder.encode(body)
super.init(service: CreateUser.service) { defaultEncoder in
return try (encoder ?? defaultEncoder).encode(body)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ extension PetstoreTest.User {

public var body: [User]

public init(body: [User], jsonEncoder: JSONEncoder = PetstoreTest.defaultJSONEncoder) {
public init(body: [User], encoder: RequestEncoder? = nil) {
self.body = body
super.init(service: CreateUsersWithArrayInput.service) {
return try jsonEncoder.encode(body)
super.init(service: CreateUsersWithArrayInput.service) { defaultEncoder in
return try (encoder ?? defaultEncoder).encode(body)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,10 @@ extension PetstoreTest.User {

public var body: [User]

public init(body: [User], jsonEncoder: JSONEncoder = PetstoreTest.defaultJSONEncoder) {
public init(body: [User], encoder: RequestEncoder? = nil) {
self.body = body
super.init(service: CreateUsersWithListInput.service) {
return try jsonEncoder.encode(body)
super.init(service: CreateUsersWithListInput.service) { defaultEncoder in
return try (encoder ?? defaultEncoder).encode(body)
}
}
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,11 @@ extension PetstoreTest.User {

public var body: User

public init(body: User, options: Options, jsonEncoder: JSONEncoder = PetstoreTest.defaultJSONEncoder) {
public init(body: User, options: Options, encoder: RequestEncoder? = nil) {
self.body = body
self.options = options
super.init(service: UpdateUser.service) {
return try jsonEncoder.encode(body)
super.init(service: UpdateUser.service) { defaultEncoder in
return try (encoder ?? defaultEncoder).encode(body)
}
}

Expand Down
8 changes: 0 additions & 8 deletions Specs/Rocket/generated/Swift/Sources/API.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,14 +21,6 @@ public struct Rocket {
/// Used to encode Dates when uses as string params
public static var dateEncodingFormatter = DateFormatter(formatString: "yyyy-MM-dd'T'HH:mm:ssZZZZZ")

/// Default JSONEncoder used to enconde each API request
public static var defaultJSONEncoder: JSONEncoder {
let jsonEncoder = JSONEncoder()
jsonEncoder.dateEncodingStrategy = .formatted(Rocket.dateEncodingFormatter)

return jsonEncoder
}

public static let version = "1.0.0"

public enum Account {}
Expand Down
8 changes: 5 additions & 3 deletions Specs/Rocket/generated/Swift/Sources/APIClient.swift
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ public class APIClient {
public var defaultHeaders: [String: String]

public var jsonDecoder = JSONDecoder()
public var jsonEncoder = JSONEncoder()

public var decodingQueue = DispatchQueue(label: "apiClient", qos: .utility, attributes: .concurrent)

Expand All @@ -33,6 +34,7 @@ public class APIClient {
self.behaviours = behaviours
self.defaultHeaders = defaultHeaders
jsonDecoder.dateDecodingStrategy = .custom(dateDecoder)
jsonEncoder.dateEncodingStrategy = .formatted(Rocket.dateEncodingFormatter)
}

/// Makes a network request
Expand All @@ -51,7 +53,7 @@ public class APIClient {
// create the url request from the request
var urlRequest: URLRequest
do {
urlRequest = try request.createURLRequest(baseURL: baseURL)
urlRequest = try request.createURLRequest(baseURL: baseURL, encoder: jsonEncoder)
} catch {
let error = APIClientError.requestEncodingError(error)
requestBehaviour.onFailure(error: error)
Expand Down Expand Up @@ -213,7 +215,7 @@ extension APIRequest {
extension APIRequest {

/// pass in an optional baseURL, otherwise URLRequest.url will be relative
public func createURLRequest(baseURL: String = "") throws -> URLRequest {
public func createURLRequest(baseURL: String = "", encoder: RequestEncoder = JSONEncoder()) throws -> URLRequest {
let url = URL(string: "\(baseURL)\(path)")!
var urlRequest = URLRequest(url: url)
urlRequest.httpMethod = service.method
Expand All @@ -240,7 +242,7 @@ extension APIRequest {
urlRequest = try URLEncoding.httpBody.encode(urlRequest, with: formParams)
}
if let encodeBody = encodeBody {
urlRequest.httpBody = try encodeBody()
urlRequest.httpBody = try encodeBody(encoder)
urlRequest.setValue("application/json", forHTTPHeaderField: "Content-Type")
}
return urlRequest
Expand Down
Loading

0 comments on commit defe317

Please sign in to comment.