in api_generator/src/generator/code_gen/url/url_builder.rs [270:336]
fn let_parameters_exprs(
url: &[PathPart<'a>],
parts: &BTreeMap<String, Type>,
) -> Vec<syn::Stmt> {
url.iter()
.filter_map(|p| match *p {
PathPart::Param(p) => {
let name = valid_name(p);
let name_ident = ident(name);
let ty = &parts[p].ty;
// don't generate an assignment expression for strings
if ty == &TypeKind::String {
return None;
}
let tokens = quote!(#name_ident);
// build a different expression, depending on the type of parameter
let (ident, init) = match ty {
TypeKind::List => {
// Join list values together
let name_str = format!("{}_str", &name);
let name_str_ident = ident(&name_str);
let join_call = syn::ExprKind::MethodCall(
ident("join"),
vec![],
vec![
parse_expr(tokens),
syn::ExprKind::Lit(syn::Lit::Str(
",".into(),
syn::StrStyle::Cooked,
))
.into(),
],
)
.into();
(name_str_ident, join_call)
}
_ => {
// Handle enums, long, int, etc. by calling to_string()
let to_string_call = syn::ExprKind::MethodCall(
ident("to_string"),
vec![],
vec![parse_expr(tokens)],
)
.into();
(ident(format!("{}_str", name)), to_string_call)
}
};
Some(syn::Stmt::Local(Box::new(syn::Local {
pat: Box::new(syn::Pat::Ident(
syn::BindingMode::ByValue(syn::Mutability::Immutable),
ident,
None,
)),
ty: None,
init: Some(Box::new(init)),
attrs: vec![],
})))
}
_ => None,
})
.collect()
}