しおメモ

雑多な技術系ブログです。

SourceryでBuilderを自動生成するテンプレート

若干需要があったので、テンプレートファイルを作成して、Sourceryを使ってBuilderを自動生成してみました。

実装は、Lombokの@BuilderのようなシンプルなBuilderのイメージです。

projectlombok.org

テンプレートと使い方

作成したテンプレートは、ここに置いてあります。

github.com

// sourcery: Builder
struct Params {
    let id: String?
    let name: String?
    let age: Int?
    let url: URL?

    var profile: String {
        return name ?? ""
    }
}

上の元々の構造体(Params)から、sourceryを実行することで、

extension Params {
    static var builder: Builder { return Builder() }

    final class Builder {
        private var id: String?
        private var name: String?
        private var age: Int?
        private var url: URL?

        func id(_ id: String?) -> Builder {
            self.id = id
            return self
        }

        func name(_ name: String?) -> Builder {
            self.name = name
            return self
        }

        func age(_ age: Int?) -> Builder {
            self.age = age
            return self
        }

        func url(_ url: URL?) -> Builder {
            self.url = url
            return self
        }

        func build() -> Params {
            return Params(id: id, name: name, age: age, url: url)
        }
    }
}

このようなコードが自動生成されます。

これにより、以下のようにインスタンスを生成できます。

let hoge = Params.builder
    .id("hoge")
    .name("hoge taro")
    .build()