fn create_impl_fn()

in api_generator/src/generator/code_gen/request/request_builder.rs [403:478]


    fn create_impl_fn(f: (&String, &Type)) -> syn::ImplItem {
        let name = valid_name(f.0).to_lowercase();
        let (ty, value_ident, fn_generics) = {
            let ty = typekind_to_ty(f.0, &f.1.ty, true, true);
            match ty {
                syn::Ty::Path(ref _q, ref p) => {
                    if p.get_ident().as_ref() == "Into" {
                        let ty = syn::parse_type("T").unwrap();
                        let ident = code_gen::ident(format!("{}.into()", &name));
                        let ty_param = syn::TyParam {
                            ident: code_gen::ident("T"),
                            default: None,
                            attrs: vec![],
                            bounds: vec![TyParamBound::Trait(
                                syn::PolyTraitRef {
                                    trait_ref: p.clone(),
                                    bound_lifetimes: vec![],
                                },
                                TraitBoundModifier::None,
                            )],
                        };
                        let generics = generics(vec![], vec![ty_param]);
                        (ty, ident, generics)
                    } else {
                        (ty, ident(&name), generics_none())
                    }
                }
                _ => (ty, ident(&name), generics_none()),
            }
        };
        let impl_ident = ident(&name);
        let field_ident = ident(&name);
        let doc_attr = match &f.1.description {
            Some(docs) => vec![doc_escaped(docs)],
            _ => vec![],
        };

        syn::ImplItem {
            ident: impl_ident,
            vis: syn::Visibility::Public,
            defaultness: syn::Defaultness::Final,
            attrs: doc_attr,
            node: syn::ImplItemKind::Method(
                syn::MethodSig {
                    unsafety: syn::Unsafety::Normal,
                    constness: syn::Constness::NotConst,
                    abi: None,
                    decl: syn::FnDecl {
                        inputs: vec![
                            syn::FnArg::SelfValue(syn::Mutability::Mutable),
                            syn::FnArg::Captured(
                                syn::Pat::Path(None, path_none(name.as_str())),
                                ty,
                            ),
                        ],
                        output: syn::FunctionRetTy::Ty(code_gen::ty("Self")),
                        variadic: false,
                    },
                    generics: fn_generics,
                },
                // generates a fn body of the form
                // --------
                // self.<field> = <field>;
                // self
                // ---------
                syn::Block {
                    stmts: vec![
                        syn::Stmt::Semi(Box::new(parse_expr(
                            quote!(self.#field_ident = Some(#value_ident)),
                        ))),
                        syn::Stmt::Expr(Box::new(parse_expr(quote!(self)))),
                    ],
                },
            ),
        }
    }