@@ -7,7 +7,8 @@ use syn::punctuated::Punctuated;
7
7
use syn:: spanned:: Spanned ;
8
8
use syn:: token:: { Comma , RArrow } ;
9
9
use syn:: {
10
- AttrStyle , Attribute , Error , Expr , ExprTuple , FnArg , GenericParam , Ident , ItemFn , Lit , LitFloat , LitStr , Meta , Pat , PatIdent , PatType , Path , ReturnType , Type , TypeParam , WhereClause , parse_quote,
10
+ AttrStyle , Attribute , Error , Expr , ExprTuple , FnArg , GenericParam , Ident , ItemFn , Lit , LitFloat , LitInt , LitStr , Meta , Pat , PatIdent , PatType , Path , ReturnType , Type , TypeParam , WhereClause ,
11
+ parse_quote,
11
12
} ;
12
13
13
14
use crate :: codegen:: generate_node_code;
@@ -110,7 +111,10 @@ pub(crate) enum ParsedField {
110
111
number_hard_min : Option < LitFloat > ,
111
112
number_hard_max : Option < LitFloat > ,
112
113
number_mode_range : Option < ExprTuple > ,
114
+ number_display_decimal_places : Option < LitInt > ,
115
+ number_step : Option < LitFloat > ,
113
116
implementations : Punctuated < Type , Comma > ,
117
+ unit : Option < LitStr > ,
114
118
} ,
115
119
Node {
116
120
pat_ident : PatIdent ,
@@ -119,7 +123,10 @@ pub(crate) enum ParsedField {
119
123
widget_override : ParsedWidgetOverride ,
120
124
input_type : Type ,
121
125
output_type : Type ,
126
+ number_display_decimal_places : Option < LitInt > ,
127
+ number_step : Option < LitFloat > ,
122
128
implementations : Punctuated < Implementation , Comma > ,
129
+ unit : Option < LitStr > ,
123
130
} ,
124
131
}
125
132
#[ derive( Debug ) ]
@@ -466,6 +473,35 @@ fn parse_field(pat_ident: PatIdent, ty: Type, attrs: &[Attribute]) -> syn::Resul
466
473
}
467
474
}
468
475
476
+ let unit = extract_attribute ( attrs, "unit" )
477
+ . map ( |attr| attr. parse_args :: < LitStr > ( ) . map_err ( |e| Error :: new_spanned ( attr, format ! ( "Expected a unit type as string" ) ) ) )
478
+ . transpose ( ) ?;
479
+
480
+ let number_display_decimal_places = extract_attribute ( attrs, "display_decimal_places" )
481
+ . map ( |attr| {
482
+ attr. parse_args :: < LitInt > ( ) . map_err ( |e| {
483
+ Error :: new_spanned (
484
+ attr,
485
+ format ! ( "Invalid `integer` for number of decimals for argument '{}': {}\n USAGE EXAMPLE: #[display_decimal_places(2)]" , ident, e) ,
486
+ )
487
+ } )
488
+ } )
489
+ . transpose ( ) ?
490
+ . map ( |f| {
491
+ if let Err ( e) = f. base10_parse :: < u32 > ( ) {
492
+ Err ( Error :: new_spanned ( f, format ! ( "Expected a `u32` for `display_decimal_places` for '{}': {}" , ident, e) ) )
493
+ } else {
494
+ Ok ( f)
495
+ }
496
+ } )
497
+ . transpose ( ) ?;
498
+ let number_step = extract_attribute ( attrs, "step" )
499
+ . map ( |attr| {
500
+ attr. parse_args :: < LitFloat > ( )
501
+ . map_err ( |e| Error :: new_spanned ( attr, format ! ( "Invalid `step` for argument '{}': {}\n USAGE EXAMPLE: #[step(2.)]" , ident, e) ) )
502
+ } )
503
+ . transpose ( ) ?;
504
+
469
505
let ( is_node, node_input_type, node_output_type) = parse_node_type ( & ty) ;
470
506
let description = attrs
471
507
. iter ( )
@@ -502,7 +538,10 @@ fn parse_field(pat_ident: PatIdent, ty: Type, attrs: &[Attribute]) -> syn::Resul
502
538
widget_override,
503
539
input_type,
504
540
output_type,
541
+ number_display_decimal_places,
542
+ number_step,
505
543
implementations,
544
+ unit,
506
545
} )
507
546
} else {
508
547
let implementations = extract_attribute ( attrs, "implementations" )
@@ -520,9 +559,12 @@ fn parse_field(pat_ident: PatIdent, ty: Type, attrs: &[Attribute]) -> syn::Resul
520
559
number_hard_min,
521
560
number_hard_max,
522
561
number_mode_range,
562
+ number_display_decimal_places,
563
+ number_step,
523
564
ty,
524
565
value_source,
525
566
implementations,
567
+ unit,
526
568
} )
527
569
}
528
570
}
@@ -738,7 +780,10 @@ mod tests {
738
780
number_hard_min: None ,
739
781
number_hard_max: None ,
740
782
number_mode_range: None ,
783
+ number_display_decimal_places: None ,
784
+ number_step: None ,
741
785
implementations: Punctuated :: new( ) ,
786
+ unit: None ,
742
787
} ] ,
743
788
body : TokenStream2 :: new ( ) ,
744
789
crate_name : FoundCrate :: Itself ,
@@ -790,7 +835,10 @@ mod tests {
790
835
widget_override: ParsedWidgetOverride :: None ,
791
836
input_type: parse_quote!( Footprint ) ,
792
837
output_type: parse_quote!( T ) ,
838
+ number_display_decimal_places: None ,
839
+ number_step: None ,
793
840
implementations: Punctuated :: new( ) ,
841
+ unit: None ,
794
842
} ,
795
843
ParsedField :: Regular {
796
844
pat_ident: pat_ident( "translate" ) ,
@@ -805,7 +853,10 @@ mod tests {
805
853
number_hard_min: None ,
806
854
number_hard_max: None ,
807
855
number_mode_range: None ,
856
+ number_display_decimal_places: None ,
857
+ number_step: None ,
808
858
implementations: Punctuated :: new( ) ,
859
+ unit: None ,
809
860
} ,
810
861
] ,
811
862
body : TokenStream2 :: new ( ) ,
@@ -860,7 +911,10 @@ mod tests {
860
911
number_hard_min: None ,
861
912
number_hard_max: None ,
862
913
number_mode_range: None ,
914
+ number_display_decimal_places: None ,
915
+ number_step: None ,
863
916
implementations: Punctuated :: new( ) ,
917
+ unit: None ,
864
918
} ] ,
865
919
body : TokenStream2 :: new ( ) ,
866
920
crate_name : FoundCrate :: Itself ,
@@ -913,12 +967,15 @@ mod tests {
913
967
number_hard_min: None ,
914
968
number_hard_max: None ,
915
969
number_mode_range: None ,
970
+ number_display_decimal_places: None ,
971
+ number_step: None ,
916
972
implementations: {
917
973
let mut p = Punctuated :: new( ) ;
918
974
p. push( parse_quote!( f32 ) ) ;
919
975
p. push( parse_quote!( f64 ) ) ;
920
976
p
921
977
} ,
978
+ unit: None ,
922
979
} ] ,
923
980
body : TokenStream2 :: new ( ) ,
924
981
crate_name : FoundCrate :: Itself ,
@@ -978,7 +1035,10 @@ mod tests {
978
1035
number_hard_min: None ,
979
1036
number_hard_max: None ,
980
1037
number_mode_range: Some ( parse_quote!( ( 0. , 100. ) ) ) ,
1038
+ number_display_decimal_places: None ,
1039
+ number_step: None ,
981
1040
implementations: Punctuated :: new( ) ,
1041
+ unit: None ,
982
1042
} ] ,
983
1043
body : TokenStream2 :: new ( ) ,
984
1044
crate_name : FoundCrate :: Itself ,
@@ -1031,7 +1091,10 @@ mod tests {
1031
1091
number_hard_min: None ,
1032
1092
number_hard_max: None ,
1033
1093
number_mode_range: None ,
1094
+ number_display_decimal_places: None ,
1095
+ number_step: None ,
1034
1096
implementations: Punctuated :: new( ) ,
1097
+ unit: None ,
1035
1098
} ] ,
1036
1099
body : TokenStream2 :: new ( ) ,
1037
1100
crate_name : FoundCrate :: Itself ,
0 commit comments