mirror of
https://github.com/GraphiteEditor/Graphite.git
synced 2025-07-12 10:15:01 +00:00
Update #[min/max] node macro attributes to #[soft/hard]_[min/max] and make them clamp their input data (#2464)
* Fix min and max macro not enforcing limits when data flows * Use trait based clamping * Remove min/max from testing * cargo fmt * Resolve into min, and hard_min * cargo fmt * fix traits * cargo fmt * fix tests * rename as soft_x * Add validation code * Clean up (not compiling because of DVec2 clamping) * Avoid needing to add trait bounds to node definitions * Code review --------- Co-authored-by: Dennis Kobert <dennis@kobert.dev> Co-authored-by: Keavon Chambers <keavon@keavon.com>
This commit is contained in:
parent
2fc4896d01
commit
9303953cf8
13 changed files with 259 additions and 46 deletions
|
@ -21,13 +21,13 @@ fn easier_string_assignment(field_ty: &Type, field_ident: &Ident) -> (TokenStrea
|
|||
// Based on https://stackoverflow.com/questions/66906261/rust-proc-macro-derive-how-do-i-check-if-a-field-is-of-a-primitive-type-like-b
|
||||
if last_segment.ident == Ident::new("String", last_segment.ident.span()) {
|
||||
return (
|
||||
quote::quote_spanned!(type_path.span() => impl Into<String>),
|
||||
quote::quote_spanned!(field_ident.span() => #field_ident.into()),
|
||||
quote::quote_spanned!(type_path.span()=> impl Into<String>),
|
||||
quote::quote_spanned!(field_ident.span()=> #field_ident.into()),
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
(quote::quote_spanned!(field_ty.span() => #field_ty), quote::quote_spanned!(field_ident.span() => #field_ident))
|
||||
(quote::quote_spanned!(field_ty.span()=> #field_ty), quote::quote_spanned!(field_ident.span()=> #field_ident))
|
||||
}
|
||||
|
||||
/// Extract the identifier of the field (which should always be present)
|
||||
|
@ -54,8 +54,8 @@ fn find_type_and_assignment(field: &Field) -> syn::Result<(TokenStream2, TokenSt
|
|||
if let Some(first_generic) = generic_args.args.first() {
|
||||
if last_segment.ident == Ident::new("WidgetCallback", last_segment.ident.span()) {
|
||||
// Assign builder pattern to assign the closure directly
|
||||
function_input_ty = quote::quote_spanned!(field_ty.span() => impl Fn(&#first_generic) -> crate::messages::message::Message + 'static + Send + Sync);
|
||||
assignment = quote::quote_spanned!(field_ident.span() => crate::messages::layout::utility_types::layout_widget::WidgetCallback::new(#field_ident));
|
||||
function_input_ty = quote::quote_spanned!(field_ty.span()=> impl Fn(&#first_generic) -> crate::messages::message::Message + 'static + Send + Sync);
|
||||
assignment = quote::quote_spanned!(field_ident.span()=> crate::messages::layout::utility_types::layout_widget::WidgetCallback::new(#field_ident));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -78,7 +78,7 @@ fn construct_builder(field: &Field) -> syn::Result<TokenStream2> {
|
|||
let (function_input_ty, assignment) = find_type_and_assignment(field)?;
|
||||
|
||||
// Create builder function
|
||||
Ok(quote::quote_spanned!(field.span() =>
|
||||
Ok(quote::quote_spanned!(field.span()=>
|
||||
#[doc = #doc_comment]
|
||||
pub fn #field_ident(mut self, #field_ident: #function_input_ty) -> Self{
|
||||
self.#field_ident = #assignment;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue