mirror of
https://github.com/servo/servo.git
synced 2025-08-05 21:50:18 +01:00
Introduce #[animation]
For now, only #[animation(error)] is supported on variants and it makes both #[derive(Animate)] and #[derive(ComputeSquaredDistance)] ignore this particular variant.
This commit is contained in:
parent
17d97cf87b
commit
ff67fc751d
5 changed files with 31 additions and 45 deletions
|
@ -14,7 +14,13 @@ pub fn derive(input: syn::DeriveInput) -> quote::Tokens {
|
|||
|
||||
let variants = cg::variants(&input);
|
||||
let mut match_body = quote!();
|
||||
match_body.append_all(variants.iter().map(|variant| {
|
||||
let mut append_error_clause = variants.len() > 1;
|
||||
match_body.append_all(variants.iter().flat_map(|variant| {
|
||||
let attrs = cg::parse_variant_attrs::<AnimateAttrs>(variant);
|
||||
if attrs.error {
|
||||
append_error_clause = true;
|
||||
return None;
|
||||
}
|
||||
let name = cg::variant_ctor(&input, variant);
|
||||
let (this_pattern, this_info) = cg::ref_pattern(&name, variant, "this");
|
||||
let (other_pattern, other_info) = cg::ref_pattern(&name, variant, "other");
|
||||
|
@ -29,15 +35,15 @@ pub fn derive(input: syn::DeriveInput) -> quote::Tokens {
|
|||
let #result = ::values::animated::Animate::animate(#this, #other, procedure)?;
|
||||
}
|
||||
}));
|
||||
quote! {
|
||||
Some(quote! {
|
||||
(&#this_pattern, &#other_pattern) => {
|
||||
#computations
|
||||
Ok(#result_value)
|
||||
}
|
||||
}
|
||||
})
|
||||
}));
|
||||
|
||||
if variants.len() > 1 {
|
||||
if append_error_clause {
|
||||
match_body = quote! { #match_body, _ => Err(()), };
|
||||
}
|
||||
|
||||
|
@ -57,3 +63,9 @@ pub fn derive(input: syn::DeriveInput) -> quote::Tokens {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Default, FromVariant)]
|
||||
#[darling(attributes(animate), default)]
|
||||
pub struct AnimateAttrs {
|
||||
pub error: bool,
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue