58 lines
1.8 KiB
Rust
58 lines
1.8 KiB
Rust
use quote::{quote, quote_spanned};
|
|
use syn::Ident;
|
|
|
|
use crate::widgets::{ConditionalBranches, ConditionalWidget, PropertyName};
|
|
|
|
use super::AssignInfo;
|
|
|
|
impl ConditionalWidget {
|
|
pub(super) fn assign_stream<'a>(
|
|
&'a self,
|
|
info: &mut AssignInfo<'a>,
|
|
p_name: &PropertyName,
|
|
sender_name: &'a Ident,
|
|
) {
|
|
let assign_fn = p_name.assign_fn_stream(info);
|
|
let self_assign_args = p_name.assign_args_stream(info.widget_name);
|
|
let span = p_name.span();
|
|
|
|
let args = self.args.as_ref().map(|args| {
|
|
quote! {
|
|
, #args
|
|
}
|
|
});
|
|
|
|
let w_name = &self.name;
|
|
let assign_args = if let Some(assign_wrapper) = &self.assign_wrapper {
|
|
quote! { #assign_wrapper (&#w_name ) }
|
|
} else {
|
|
quote_spanned! { w_name.span() => &#w_name }
|
|
};
|
|
|
|
info.stream.extend(quote_spanned! {
|
|
span => #assign_fn(#self_assign_args #assign_args #args);
|
|
});
|
|
|
|
let mut info = AssignInfo {
|
|
stream: info.stream,
|
|
widget_name: &self.name,
|
|
template_path: None,
|
|
is_conditional: true,
|
|
};
|
|
match &self.branches {
|
|
ConditionalBranches::If(if_branches) => {
|
|
for branch in if_branches {
|
|
let p_name = PropertyName::Ident(Ident::new("add_named", p_name.span()));
|
|
branch.widget.assign_stream(&mut info, &p_name, sender_name);
|
|
}
|
|
}
|
|
ConditionalBranches::Match((_, _, match_arms)) => {
|
|
for arm in match_arms {
|
|
let p_name = PropertyName::Ident(Ident::new("add_named", p_name.span()));
|
|
arm.widget.assign_stream(&mut info, &p_name, sender_name);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|