@@ -6,7 +6,7 @@ use thiserror::Error;
6
6
7
7
use bevy_proto_bsn_ast:: {
8
8
quote:: ToTokens ,
9
- syn:: { Expr , ExprCall , ExprLit , ExprStruct , Lit , Member } ,
9
+ syn:: { Expr , ExprCall , ExprLit , ExprStruct , ExprUnary , Lit , Member , UnOp } ,
10
10
* ,
11
11
} ;
12
12
@@ -262,6 +262,10 @@ impl From<&Expr> for BsnValue {
262
262
Expr :: Struct ( strct) => strct. into ( ) ,
263
263
Expr :: Call ( call) => call. into ( ) ,
264
264
Expr :: Paren ( paren) => paren. expr . as_ref ( ) . into ( ) ,
265
+ Expr :: Unary ( unary) => unary. try_into ( ) . unwrap_or_else ( |err| {
266
+ error ! ( "{err:?}" ) ;
267
+ BsnValue :: UnknownExpr ( expr. to_token_stream ( ) . to_string ( ) )
268
+ } ) ,
265
269
expr => BsnValue :: UnknownExpr ( expr. to_token_stream ( ) . to_string ( ) ) ,
266
270
}
267
271
}
@@ -310,6 +314,27 @@ impl From<&ExprCall> for BsnValue {
310
314
}
311
315
}
312
316
317
+ impl TryFrom < & ExprUnary > for BsnValue {
318
+ type Error = BsnLoaderError ;
319
+
320
+ fn try_from ( value : & ExprUnary ) -> Result < Self , Self :: Error > {
321
+ if let UnOp :: Neg ( _) = value. op {
322
+ if let Expr :: Lit ( lit) = value. expr . as_ref ( ) {
323
+ let mut bsn_value: BsnValue = lit. into ( ) ;
324
+ if let BsnValue :: Number ( ref mut f) = bsn_value {
325
+ f. insert ( 0 , '-' ) ;
326
+ return Ok ( bsn_value) ;
327
+ }
328
+ }
329
+ }
330
+
331
+ return Err ( BsnLoaderError :: SyntaxError ( format ! (
332
+ "Could not parse unary expression: {}" ,
333
+ value. to_token_stream( ) . to_string( )
334
+ ) ) ) ;
335
+ }
336
+ }
337
+
313
338
trait ToTokensExt {
314
339
fn to_compact_string ( & self ) -> String ;
315
340
}
0 commit comments