in starlark_derive/src/render.rs [299:349]
fn render_binding_arg(arg: &StarArg) -> TokenStream {
let span = arg.span;
let name = &arg.name;
let name_str = ident_string(name);
let ty = &arg.ty;
let source = match arg.source {
StarArgSource::This => quote_spanned! {span=> __this},
StarArgSource::Argument(i) => quote_spanned! {span=> __args[#i].get()},
StarArgSource::Required(i) => quote_spanned! {span=> Some(__required[#i])},
StarArgSource::Optional(i) => quote_spanned! {span=> __optional[#i]},
ref s => unreachable!("unknown source: {:?}", s),
};
// Rust doesn't have powerful enough nested if yet
let next = if arg.is_this() {
quote_spanned! { span=> starlark::eval::Arguments::check_this(#source)? }
} else if arg.is_option() {
assert!(
arg.default.is_none(),
"Can't have Option argument with a default, for `{}`",
name_str
);
quote_spanned! { span=> starlark::eval::Arguments::check_optional(#name_str, #source)? }
} else if !arg.is_value() && arg.default.is_some() {
let default = arg
.default
.as_ref()
.unwrap_or_else(|| unreachable!("Checked on the line above"));
quote_spanned! { span=>
{
// Combo
#[allow(clippy::manual_unwrap_or)]
#[allow(clippy::unnecessary_lazy_evaluations)]
#[allow(clippy::redundant_closure)]
let x = starlark::eval::Arguments::check_optional(#name_str, #source)?.unwrap_or_else(|| #default);
x
}
}
} else {
quote_spanned! { span=> starlark::eval::Arguments::check_required(#name_str, #source)? }
};
let mutability = mut_token(arg.mutable);
let attrs = &arg.attrs;
quote_spanned! {
span=>
#( #attrs )*
let #mutability #name: #ty = #next;
}
}