OpenAPITools / OpenAPITools/openapi-generator
[REQ] [Swift5] POP proposal
還沒有人認領這個 Issue。
- 主要語言
- Java
- 星號
- 26.8k
- 分支
- 7.7k
- PR 合併指標
- PR 指標待擷取
描述
Hi guys,
I've been using the OpenAPI Generator for Swift 4/5 for a while now, quite happy with your work, thanks!
But after a while I struggled a bit whenever I needed to add some customisation on the generated code.
Mainly the issues I found were related to the fact that the methods are defined as class func.
That makes it hard to:
- override: you would need to define a class
SomethingSubclassAPIthat inherits from the generatedSomethingAPIclass and override the method. Then you would need to use the subclass around. Easy to do if that happens at the beginning of the project, much more complicated if you already used a lot the generated class around - it forces you to pass through the same classes for all the calls, hence the problem above
I then modified the templates to achieve something different.
From this:
open class AlertAPI {
/**
Returns the alert
- parameter ifNoneMatch: (header) The value of the Etag header returned in the previous response (optional)
- parameter completion: completion handler to receive the data and the error objects
*/
open class func getAlert(ifNoneMatch: String? = nil, completion: @escaping ((_ data: [Alert]?,_ error: Error?) -> Void)) {
getAlertWithRequestBuilder(ifNoneMatch: ifNoneMatch).execute { (response, error) -> Void in
completion(response?.body, error)
}
}
}
To this:
public protocol AlertAPIProtocol {
/**
Returns the alert
- parameter ifNoneMatch: (header) The value of the Etag header returned in the previous response (optional)
- parameter completion: completion handler to receive the data and the error objects
*/
static func getAlert(ifNoneMatch: String?, completion: @escaping ((_ data: [Alert]?, _ headers:[String:String]?, _ error: Error?) -> Void))
}
public extension AlertAPIProtocol {
static func getAlert(ifNoneMatch: String? = nil, completion: @escaping ((_ data: [Alert]?, _ headers:[String:String]?, _ error: Error?) -> Void)) {
getAlertWithRequestBuilder(ifNoneMatch: ifNoneMatch).execute { (response, error) -> Void in
completion(response?.body, response?.header, error)
}
}
}
This approach works quite well for me and it allows me to:
- conform to the protocol in each class/struct/enum where I need to perform such API request
- override the methods whenever and wherever I need to. I can override in a single case, if needed, or in a subprotocol, or even make conditional override based on conditions through the
whereoperator - plug different protocols to the same class/struct/enum, composing different APIs by needs
Additionally I have an autogenerated Mock version of the same protocols, that inherits from the original ones, that load content from a json in the bundle. This approach opens to the possibility of conforming to AlertAPIPrototocol in a target and to AlertAPIMockPrototocol in another and being one a subprotocol to the other you can easily use polymorphism.
This is just an example of what this approach can lead to. :-)
I'd love to see this approach implemented in the official OpenAPI Generator for swift, I think it could be useful for a lot of people.
Are you interested on discussing this further?
Thanks,
Alessandro
貢獻指南
從這裡開始
- 先讀完整個 Issue,再讀專案的貢獻指南。
- 在 Issue 下留言說明你要接手 —— 這能避免兩個人做同樣的事。
- Fork 儲存庫,在一個分支上完成修改。
- 送出 Pull Request,並在描述裡引用這個 Issue 編號。
研究方向
檢視 Swift 4/5 產生器範本,並將其目前產生的 API 類別與 issue 中的 AlertAPI 和 AlertAPIProtocol 範例進行比較。與維護者釐清預期範圍,包括協定產生、自訂和 mock 支援。當約定的協定導向方法在 Swift 產生器中一致實作後,即表示完成。
由索引模型根據 Issue 內容生成。
評估
- 技術堆疊
- swift
- 領域
- tooling
- Issue 類型
- 功能
- 難度
- 5/5
- 預估耗時
- 一週以上
- 活躍度
- 停滯
- 描述清晰度
- 基本清楚
- 新手友好度
- 35/100