fn freeze_struct()

in starlark_derive/src/freeze.rs [193:251]


fn freeze_struct(name: &Ident, data: &DataStruct) -> syn::Result<TokenStream> {
    let res = match data.fields {
        Fields::Named(ref fields) => {
            let xs = fields
                .named
                .iter()
                .map(|f| {
                    let name = &f.ident;
                    let res = if is_identity(&f.attrs)? {
                        quote_spanned! {f.span() =>
                            #name: self.#name,
                        }
                    } else {
                        quote_spanned! {f.span() =>
                            #name: starlark::values::Freeze::freeze(self.#name, freezer)?,
                        }
                    };

                    syn::Result::Ok(res)
                })
                .collect::<Result<Vec<_>, _>>()?;
            quote! {
                #name {
                    #(#xs)*
                }
            }
        }
        Fields::Unnamed(ref fields) => {
            let xs = fields
                .unnamed
                .iter()
                .enumerate()
                .map(|(i, f)| {
                    let i = Index::from(i);

                    let res = if is_identity(&f.attrs)? {
                        quote_spanned! {f.span() =>
                            self.#i,
                        }
                    } else {
                        quote_spanned! {f.span() => starlark::values::Freeze::freeze(self.#i, freezer)?,}
                    };

                    syn::Result::Ok(res)
                })
                .collect::<Result<Vec<_>, _>>()?;
            quote! {
                #name (
                    #(#xs)*
                )
            }
        }
        Fields::Unit => {
            quote!()
        }
    };

    Ok(res)
}