22
33use proc_macro2:: Span ;
44use syn:: {
5- LitStr , Token ,
6- parse:: { self , Parse , ParseStream } ,
5+ parse:: { self , Parse , ParseStream } , spanned:: Spanned , ExprRange , LitStr , RangeLimits , Token
76} ;
87
98//FOO: i32 = 0, "x * 3.0"
109//FOO: i32 = 0 // defaults to "x"
11- pub ( crate ) struct Args {
10+ pub ( crate ) struct MetricArgs {
1211 pub ( crate ) name : syn:: Ident ,
1312 pub ( crate ) ty : syn:: Ident ,
1413 pub ( crate ) initial_val : syn:: Expr ,
1514 pub ( crate ) expression_string : syn:: LitStr ,
1615}
1716
18- impl Parse for Args {
17+ impl Parse for MetricArgs {
1918 fn parse ( input : ParseStream ) -> parse:: Result < Self > {
20- let name = input. parse ( ) ?;
19+ let name: syn :: Ident = input. parse ( ) ?;
2120 let _comma: Token ! [ : ] = input. parse ( ) ?;
2221 let ty = input. parse ( ) ?;
2322 let _comma: Token ! [ =] = input. parse ( ) ?;
@@ -29,7 +28,7 @@ impl Parse for Args {
2928 let expression_string = match ( comma, expression_string) {
3029 ( Ok ( _) , Ok ( expr) ) => expr,
3130 ( Ok ( _) , Err ( e) ) => return Err ( e) ,
32- ( Err ( _) , _) => LitStr :: new ( "x" , Span :: mixed_site ( ) ) ,
31+ ( Err ( _) , _) => LitStr :: new ( & name . to_string ( ) , name . span ( ) ) ,
3332 } ;
3433
3534 Ok ( Self {
@@ -40,3 +39,58 @@ impl Parse for Args {
4039 } )
4140 }
4241}
42+
43+ // FOO: i32 = 0, 0..=10, 2
44+ // FOO: i32 = 0, 0..=10, // Step size defaults to 1
45+ // FOO: i32 = 0 // range defaults to the types full range
46+ // TODO Implement the defaults
47+ pub ( crate ) struct SettingArgs {
48+ pub ( crate ) name : syn:: Ident ,
49+ pub ( crate ) ty : syn:: Ident ,
50+ pub ( crate ) initial_val : syn:: Expr ,
51+ pub ( crate ) range_start : syn:: LitFloat ,
52+ pub ( crate ) range_end : syn:: LitFloat ,
53+ pub ( crate ) step_size : syn:: LitFloat ,
54+ }
55+
56+ impl Parse for SettingArgs {
57+ fn parse ( input : ParseStream ) -> parse:: Result < Self > {
58+ let name = input. parse ( ) ?;
59+ let _colon: Token ! [ : ] = input. parse ( ) ?;
60+ let ty = input. parse ( ) ?;
61+ let _eq: Token ! [ =] = input. parse ( ) ?;
62+ let initial_val = input. parse ( ) ?;
63+
64+ let _comma: parse:: Result < Token ! [ , ] > = input. parse ( ) ;
65+ let range: syn:: Expr = input. parse ( ) ?;
66+
67+ let syn:: Expr :: Range ( range) = range else {
68+ panic ! ( "Invalid range" )
69+ } ;
70+
71+ let range_start = range. start . expect ( "Only inclusive ranges with both a start and end are supported" ) ;
72+ let range_end = range. end . expect ( "Only inclusive ranges with both a start and end are supported" ) ;
73+ assert ! ( matches!( range. limits, RangeLimits :: Closed ( _) ) , "Only inclusive ranges with both a start and end are supported" ) ;
74+
75+ let _comma: parse:: Result < Token ! [ , ] > = input. parse ( ) ;
76+ let step_size = input. parse ( ) ?;
77+
78+ Ok ( Self {
79+ name,
80+ ty,
81+ initial_val,
82+ range_start : expr_to_float_lit ( * range_start) ,
83+ range_end : expr_to_float_lit ( * range_end) ,
84+ step_size
85+ } )
86+ }
87+ }
88+
89+
90+ fn expr_to_float_lit ( e : syn:: Expr ) -> syn:: LitFloat {
91+ match e. clone ( ) {
92+ syn:: Expr :: Lit ( syn:: ExprLit { lit : syn:: Lit :: Float ( f) , .. } ) => f,
93+ syn:: Expr :: Lit ( syn:: ExprLit { lit : syn:: Lit :: Int ( i) , .. } ) => syn:: LitFloat :: new ( & format ! ( "{}.0" , i. base10_digits( ) ) , e. span ( ) ) ,
94+ _ => panic ! ( "expected float literal" )
95+ }
96+ }
0 commit comments