fn gen_buildable_impl()

in shed/facet/proc_macros/container_impl.rs [167:214]


fn gen_buildable_impl(
    facet_crate: &Ident,
    container_name: &Ident,
    members: &ContainerMembers,
) -> TokenStream {
    let facet_idents = &members.facet_idents;
    let facet_types = &members.facet_types;
    let field_idents = &members.field_idents;
    let field_inits = &members.field_inits;
    let delegate_idents = &members.delegate_idents;
    let delegate_types = &members.delegate_types;

    quote! {
        impl<B> ::#facet_crate::Buildable<B> for #container_name
        where B: ::std::marker::Send + ::std::marker::Sync
            #( + ::#facet_crate::Builder<::std::sync::Arc<#facet_types>> )*,
            #( #delegate_types: ::#facet_crate::Buildable<B>, )*
        {
           fn build(builder: &mut B) -> ::std::result::Result<Self, ::#facet_crate::FactoryError> {

                // Build each delegate.
                #(
                    let #delegate_idents =
                        <#delegate_types as ::#facet_crate::Buildable<B>>::build(builder)?;
                )*

                // Build each facet.
                #(
                    let #facet_idents =
                        <B as ::#facet_crate::Builder<
                            ::std::sync::Arc<#facet_types>
                        >>::build(builder)?;
                )*

                // Initialize the other fields.
                #(
                    let #field_idents = #field_inits;
                )*

                Ok(Self {
                    #( #delegate_idents, )*
                    #( #field_idents, )*
                    #( #facet_idents, )*
                })
           }
        }
    }
}