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)))),
],
},
),
}
}