Skip to content

Commit 6fc79b1

Browse files
committed
Fix min and max macro not enforcing limits when data flows
1 parent 6292dea commit 6fc79b1

File tree

1 file changed

+34
-0
lines changed

1 file changed

+34
-0
lines changed

node-graph/node-macro/src/codegen.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,6 +175,39 @@ pub(crate) fn generate_node_code(parsed: &ParsedNodeFn) -> syn::Result<TokenStre
175175
}
176176
});
177177

178+
let min_max_args = fields.iter().map(|field| match field {
179+
ParsedField::Regular {
180+
pat_ident,
181+
number_min,
182+
number_max,
183+
ty,
184+
..
185+
} => {
186+
let name = &pat_ident.ident;
187+
let mut tokens = quote! {};
188+
let is_generic = matches!(ty, syn::Type::Path(p) if p.path.segments.first().map_or(false, |seg| seg.ident.to_string().chars().next().unwrap().is_uppercase()));
189+
if !is_generic {
190+
if let Some(min) = number_min {
191+
tokens = quote! {
192+
#tokens
193+
let #name = if #name < (#min as #ty) { (#min as #ty) } else { #name };
194+
};
195+
}
196+
197+
if let Some(max) = number_max {
198+
tokens = quote! {
199+
#tokens
200+
let #name = if #name > (#max as #ty) { (#max as #ty) } else { #name };
201+
};
202+
}
203+
}
204+
tokens
205+
}
206+
ParsedField::Node { .. } => {
207+
quote! {}
208+
}
209+
});
210+
178211
let all_implementation_types = fields.iter().flat_map(|field| match field {
179212
ParsedField::Regular { implementations, .. } => implementations.into_iter().cloned().collect::<Vec<_>>(),
180213
ParsedField::Node { implementations, .. } => implementations
@@ -237,6 +270,7 @@ pub(crate) fn generate_node_code(parsed: &ParsedNodeFn) -> syn::Result<TokenStre
237270
fn eval(&'n self, __input: #input_type) -> Self::Output {
238271
Box::pin(async move {
239272
#(#eval_args)*
273+
#(#min_max_args)*
240274
self::#fn_name(__input #(, #field_names)*) #await_keyword
241275
})
242276
}

0 commit comments

Comments
 (0)