🏭

オンラインSwiftコード生成ツールをつくった

ブラウザで利用できるSwiftコード生成ツールを作成した。

https://shtnkgm.github.io/SwiftCodeGenerator/ (opens new window)

↓見た目

SwiftCodeGeneratorのUI

SwiftでTDDを進めるにあたり、Mockとなるインスタンスの生成コードを書くのが大変だっため、Webツールを作成した。 SourceryやPure Swiftでやる方法も検討したが、Vue.jsでコードも書きたかったため、Web技術で作成した。

できること

以下のような型定義を入力フォームにコピペすると、

struct Book {
    let price: Int
    let title: String
}

以下のようなコードを出力する。

メンバーワイズイニシャライザ

extension Book {
    init(
        price: Int,
        title: String
    ) {
        self.price = price
        self.title = title
    }
}

ファクトリメソッド(適当な値でインスタンスを生成するmakeメソッド)

extension Book {
    static func make(
        price: Int = 0,
        title: String = ""
    ) -> Book {
        return Book(
            price: price,
            title: title
        )
    }
}

Codableに準拠するための実装

extension Book: Codable {
    enum CodingKeys: String, CodingKey {
        case price
        case title
    }

    init(from decoder: Decoder) throws {
        let container = try decoder.container(keyedBy: CodingKeys.self)
        price = try container.decode(Int.self, forKey: .price)
        title = try container.decode(String.self, forKey: .title)
    }

    func encode(to encoder: Encoder) throws {
        var container = encoder.container(keyedBy: CodingKeys.self)
        try container.encode(price, forKey: .price)
        try container.encode(title, forKey: .title)
    }
}

Equatableに準拠するための実装

extension Book: Equatable {
    static func == (lhs: Book, rhs: Book) -> Bool {
        return
            lhs.price == rhs.price &&
            lhs.title == rhs.title
    }
}

構成

コード生成処理はクライアントサイドで行うため、かなりライトな構成。