pub struct {{ m.builder_ident }}<T>(T);

impl<T> {{ m.builder_ident }}<T>
where
    T: {{ m.trait_ident }}
{
    {%- for f in m.fields %}

    {%- let maybe_gp %}
    {%- if f.is_repeated %}
        {%- let maybe_gp = "<ScalarType, RepeatedType>" %}
    {%- else %}
        {%- let maybe_gp = "<ScalarType>" %}
    {%- endif %}

    pub fn append_{{ f.ident_unesc }}{{ maybe_gp }}(self, value: {{ f.single_field_type }})
        -> {{ m.builder_ident }}<(T, {{ m.single_field_ident }}{{ f.number }}{{ maybe_gp }})>
    {%- call single_field_bound(f) %}
    {
        {{ m.builder_ident }}((self.0, {{ m.single_field_ident }}{{ f.number }} { {{ f.ident }}: value}))
    }

    {%- endfor %}

    pub fn build(self) -> T {
        self.0
    }
}

impl {{ m.builder_ident }}<()>
{
    pub fn new() -> Self { Self(()) }
}