in api_generator/src/generator/code_gen/request/request_builder.rs [671:757]
fn create_builder_struct_ctor_fns(
docs_dir: &Path,
namespace_name: &str,
name: &str,
builder_name: &str,
endpoint: &ApiEndpoint,
is_root_method: bool,
enum_builder: &EnumBuilder,
) -> Tokens {
let cfg_attr = endpoint.stability.outer_cfg_attr();
let cfg_doc = stability_doc(endpoint.stability);
let builder_ident = ident(builder_name);
let (fn_name, builder_ident_ret) = {
let i = ident(name);
let b = builder_ident.clone();
match (endpoint.supports_body(), is_root_method) {
(true, true) => (quote!(#i<'a, 'b>), quote!(#b<'a, 'b, ()>)),
(false, true) => (quote!(#i<'a, 'b>), quote!(#b<'a, 'b>)),
(true, false) => (quote!(#i<'b>), quote!(#b<'a, 'b, ()>)),
(false, false) => (quote!(#i<'b>), quote!(#b<'a, 'b>)),
}
};
let api_name_for_docs = split_on_pascal_case(builder_name);
let markdown_doc = {
let mut path = docs_dir.to_owned();
path.push("functions");
path.push(format!("{}.{}.md", namespace_name, name));
if path.exists() {
let mut s = fs::read_to_string(&path)
.unwrap_or_else(|_| panic!("Could not read file at {:?}", &path));
s = s.replace("\r\n", "\n");
if !s.starts_with("\n\n") {
s.insert_str(0, "\n\n");
}
s
} else {
String::new()
}
};
let method_doc = match (
endpoint.documentation.description.as_ref(),
endpoint.documentation.url.as_ref(),
) {
(Some(d), Some(u)) if Url::parse(u).is_ok() => doc(format!(
"[{} API]({})\n\n{}{}",
api_name_for_docs, u, d, markdown_doc
)),
(Some(d), None) => doc(format!(
"{} API\n\n{}{}",
api_name_for_docs, d, markdown_doc
)),
(None, Some(u)) if Url::parse(u).is_ok() => doc(format!(
"[{} API]({}){}",
api_name_for_docs, u, markdown_doc
)),
_ => doc(format!("{} API{}", api_name_for_docs, markdown_doc)),
};
let clone_expr = quote!(self.transport());
if enum_builder.contains_single_parameterless_part() {
quote!(
#method_doc
#cfg_doc
#cfg_attr
pub fn #fn_name(&'a self) -> #builder_ident_ret {
#builder_ident::new(#clone_expr)
}
)
} else {
let (enum_ty, _, _) = enum_builder.clone().build();
quote!(
#method_doc
#cfg_doc
#cfg_attr
pub fn #fn_name(&'a self, parts: #enum_ty) -> #builder_ident_ret {
#builder_ident::new(#clone_expr, parts)
}
)
}
}