Skip to content

Instantly share code, notes, and snippets.

@ceeK
Last active March 8, 2018 18:10
Show Gist options
  • Save ceeK/d1cffc55b229a2a42b56ce4282385577 to your computer and use it in GitHub Desktop.
Save ceeK/d1cffc55b229a2a42b56ce4282385577 to your computer and use it in GitHub Desktop.
AutoBuildable stencil
{#
AutoBuildable let's you create builders for your types. By conforming to AutoBuildable and running sourcery, you get the ability to build your object:
let car = CarBuilder()
.set(wheels: 4)
.set(doors: 5)
.make()
#}// swiftlint:disable file_length, redundant_optional_initialization
{% for type in types.implementing.AutoBuildable|!enum %}
public final class {{type.name}}Builder {
{% for init in type.initializers where not init.isConvenienceInitializer %}
{% for param in init.parameters %}
private(set) var {{ param.name }}: {{ param.typeName }}{% if param.defaultValue %} = {{ param.defaultValue }}{% endif %}
{% endfor %}
{% endfor %}
{% for init in type.initializers where not init.isConvenienceInitializer %}
{% for variable in init.parameters %}
func set({{ variable.name }}: {{ variable.typeName }}) -> {{ type.name }}Builder {
self.{{ variable.name }} = {{ variable.name }}
return self
}
{% endfor %}
{% endfor %}
init(
{% for init in type.initializers where not init.isConvenienceInitializer %}
{% for variable in init.parameters where not variable.defaultValue %}
{{ variable.name }}: {{ variable.typeName }}{% if not forloop.last %},{% endif %}
{% endfor %}
{% endfor %}
) {
{% for init in type.initializers where not init.isConvenienceInitializer %}
{% for variable in init.parameters where not variable.defaultValue %}
self.{{ variable.name }} = {{ variable.name }}
{% endfor %}
{% endfor %}
}
func make() -> {{ type.name }} {
return {{ type.name }}(
{% for init in type.initializers where not init.isConvenienceInitializer %}
{% for variable in init.parameters %}
{{ variable.name }}: self.{{ variable.name}}{% if not forloop.last %},{% endif %}
{% endfor %}
{% endfor %}
)
}
}
{% endfor %}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment