请求模型宏

我厌倦了重复创建带有自定义头部和主体的请求模型的相同模式,因此我决定创建一个 Swift 宏来帮助我简化这个过程。

特性

此库包含各种 Swift 宏,可以在您的项目中使用,以改进代码生成并减少重复性任务

用法

输入

import RequestModelMacro

@RequestModel
struct ComplexRequest {
    @Header("Auth")
    var token: String
    
    @Header("Content-Type")
    var contentType: String
    
    @Body("data")
    var payload: String
    
    @Body("metadata")
    var info: String
}

生成的代码&

struct ComplexRequest {
    var token: String {
        get {
            headers.token
        }
    }

    var contentType: String {
        get {
            headers.contentType
        }
    }

    var payload: String {
        get {
            body.payload
        }
    }

    var info: String {
        get {
            body.info
        }
    }

    private struct Headers: Codable {
        let token: String
        let contentType: String

        enum CodingKeys: String, CodingKey {
            case token = "Auth"
            case contentType = "Content-Type"
        }
    }

    private struct Body: Codable {
        let payload: String
        let info: String

        enum CodingKeys: String, CodingKey {
            case payload = "data"
            case info = "metadata"
        }
    }

    var headersDictionary: [String: String] {
        do {
            let encoder = JSONEncoder()
            let data = try encoder.encode(headers)
            let jsonObject = try JSONSerialization.jsonObject(with: data, options: [])

            if let dictionary = jsonObject as? [String: String] {
                return dictionary
            } else {
                print("Warning: Failed to cast headers dictionary to [String: String]")
                return [:]
            }
        } catch {
            assertionFailure("Warning: Failed to encode headers: \\(error)")
            return [:]
        }
    }

    var bodyDictionary: [String: Any] {
        do {
            let encoder = JSONEncoder()
            let data = try encoder.encode(body)
            let jsonObject = try JSONSerialization.jsonObject(with: data, options: [])

            if let dictionary = jsonObject as? [String: Any] {
                return dictionary
            } else {
                print("Warning: Failed to cast body dictionary to [String: Any]")
                return [:]
            }
        } catch {
            assertionFailure("Warning: Failed to encode body: \\(error)")
            return [:]
        }
    }

    private var headers: Headers

    private var body: Body

    init(token: String, contentType: String, payload: String, info: String) {
        self.headers = Headers(token: token, contentType: contentType)
        self.body = Body(payload: payload, info: info)
    }
}

安装

Swift 包管理器

您可以使用 Swift 包管理器将此库添加到您的项目中,方法是在您的 Package.swift 中添加以下依赖项

.package(url: "https://github.com/brunogama/RequestModelMacro.git", from: "0.0.1")

注意: 此库缺乏更多测试。因此,使用风险自负。

贡献

我们欢迎贡献来改进此库!请随时提出 issue 或提交 pull request。

许可

此库在 MIT 许可下获得许可。 有关更多详细信息,请参见 LICENSE 文件。

联系方式

如有任何问题或建议,请随时在 Twitter 上与 @brunogama 联系。