fn gen_attr_impls()

in shed/facet/proc_macros/container_impl.rs [303:386]


fn gen_attr_impls(
    facet_crate: &Ident,
    container_name: &Ident,
    members: &ContainerMembers,
) -> Vec<TokenStream> {
    let mut output = Vec::new();
    let facet_idents = &members.facet_idents;
    let facet_types = &members.facet_types;
    let delegate_idents = &members.delegate_idents;
    let delegate_facets = &members.delegate_facets;

    for (facet_ident, facet_type) in facet_idents.iter().zip(facet_types) {
        output.push(quote! {
            impl ::#facet_crate::FacetRef<#facet_type> for #container_name {
                #[inline]
                fn facet_ref(&self) -> &(#facet_type)
                {
                    self.#facet_ident.as_ref()
                }
            }

            impl ::#facet_crate::FacetRef<#facet_type> for &#container_name {
                #[inline]
                fn facet_ref(&self) -> &(#facet_type)
                {
                    (*self).#facet_ident.as_ref()
                }
            }

            impl ::#facet_crate::FacetArc<#facet_type> for #container_name {
                #[inline]
                fn facet_arc(&self) -> ::std::sync::Arc<#facet_type>
                {
                    self.#facet_ident.clone()
                }
            }

            impl ::#facet_crate::FacetArc<#facet_type> for &#container_name {
                #[inline]
                fn facet_arc(&self) -> ::std::sync::Arc<#facet_type>
                {
                    (*self).#facet_ident.clone()
                }
            }

        });
    }

    for (delegate_ident, delegate_facet) in delegate_idents.iter().zip(delegate_facets) {
        output.push(quote! {
            #(
                impl ::#facet_crate::FacetRef<#delegate_facet> for #container_name {
                    #[inline]
                    fn facet_ref(&self) -> &(#delegate_facet) {
                        self.#delegate_ident.facet_ref()
                    }
                }

                impl ::#facet_crate::FacetRef<#delegate_facet> for &#container_name {
                    #[inline]
                    fn facet_ref(&self) -> &(#delegate_facet) {
                        self.#delegate_ident.facet_ref()
                    }
                }

                impl ::#facet_crate::FacetArc<#delegate_facet> for #container_name {
                    #[inline]
                    fn facet_arc(&self) -> ::std::sync::Arc<#delegate_facet> {
                        self.#delegate_ident.facet_arc()
                    }
                }

                impl ::#facet_crate::FacetArc<#delegate_facet> for &#container_name {
                    #[inline]
                    fn facet_arc(&self) -> ::std::sync::Arc<#delegate_facet> {
                        self.#delegate_ident.facet_arc()
                    }
                }
            )*
        });
    }

    output
}