@@ -393,29 +393,37 @@ pub enum Expression {
393393}
394394
395395impl Expression {
396- pub fn as_number ( & self ) -> anyhow:: Result < f64 > {
396+ pub fn try_into_number ( & self ) -> anyhow:: Result < f64 > {
397397 let Self :: Number ( number) = self else {
398398 bail ! ( "tried to cast '{self:?}' to a number, failed" )
399399 } ;
400400
401401 Ok ( * number)
402402 }
403403
404- pub fn as_boolean ( & self ) -> anyhow:: Result < bool > {
404+ pub fn try_into_boolean ( & self ) -> anyhow:: Result < bool > {
405405 let Self :: Boolean ( boolean) = self else {
406406 bail ! ( "tried to cast '{self:?}' to a boolean, failed" )
407407 } ;
408408
409409 Ok ( * boolean)
410410 }
411411
412- pub fn as_string ( & self ) -> anyhow:: Result < & String > {
412+ pub fn try_into_string ( & self ) -> anyhow:: Result < & String > {
413413 let Self :: String ( string) = self else {
414414 bail ! ( "tried to cast '{self:?}' to a string, failed" )
415415 } ;
416416
417417 Ok ( string)
418418 }
419+
420+ pub fn try_into_list ( & self ) -> anyhow:: Result < & Vec < Expression > > {
421+ let Self :: List ( list) = self else {
422+ bail ! ( "tried to cast '{self:?}' to a list, failed" )
423+ } ;
424+
425+ Ok ( list)
426+ }
419427}
420428
421429#[ derive( Debug , Clone , PartialEq ) ]
@@ -495,26 +503,36 @@ impl Expression {
495503 List ( result)
496504 } ,
497505
498- Plus { a, b } => Number ( eval ! ( a) . as_number ( ) ? + eval ! ( b) . as_number ( ) ?) ,
499- Minus { a, b } => Number ( eval ! ( a) . as_number ( ) ? - eval ! ( b) . as_number ( ) ?) ,
506+ Plus { a, b } => {
507+ Number ( eval ! ( a) . try_into_number ( ) ? + eval ! ( b) . try_into_number ( ) ?)
508+ } ,
509+ Minus { a, b } => {
510+ Number ( eval ! ( a) . try_into_number ( ) ? - eval ! ( b) . try_into_number ( ) ?)
511+ } ,
500512 Multiply { a, b } => {
501- Number ( eval ! ( a) . as_number ( ) ? * eval ! ( b) . as_number ( ) ?)
513+ Number ( eval ! ( a) . try_into_number ( ) ? * eval ! ( b) . try_into_number ( ) ?)
502514 } ,
503515 Power { a, b } => {
504- Number ( eval ! ( a) . as_number ( ) ?. powf ( eval ! ( b) . as_number ( ) ?) )
516+ Number (
517+ eval ! ( a)
518+ . try_into_number ( ) ?
519+ . powf ( eval ! ( b) . try_into_number ( ) ?) ,
520+ )
521+ } ,
522+ Divide { a, b } => {
523+ Number ( eval ! ( a) . try_into_number ( ) ? / eval ! ( b) . try_into_number ( ) ?)
505524 } ,
506- Divide { a, b } => Number ( eval ! ( a) . as_number ( ) ? / eval ! ( b) . as_number ( ) ?) ,
507525
508526 LessThan { a, b } => {
509- Boolean ( eval ! ( a) . as_number ( ) ? < eval ! ( b) . as_number ( ) ?)
527+ Boolean ( eval ! ( a) . try_into_number ( ) ? < eval ! ( b) . try_into_number ( ) ?)
510528 } ,
511529 MoreThan { a, b } => {
512- Boolean ( eval ! ( a) . as_number ( ) ? > eval ! ( b) . as_number ( ) ?)
530+ Boolean ( eval ! ( a) . try_into_number ( ) ? > eval ! ( b) . try_into_number ( ) ?)
513531 } ,
514532 Equal { a, b, leeway } => {
515- let a = eval ! ( a) . as_number ( ) ?;
516- let b = eval ! ( b) . as_number ( ) ?;
517- let leeway = eval ! ( leeway) . as_number ( ) ?;
533+ let a = eval ! ( a) . try_into_number ( ) ?;
534+ let b = eval ! ( b) . try_into_number ( ) ?;
535+ let leeway = eval ! ( leeway) . try_into_number ( ) ?;
518536
519537 let minimum = a - leeway;
520538 let maximum = a + leeway;
@@ -527,7 +545,7 @@ impl Expression {
527545 consequence,
528546 alternative,
529547 } => {
530- if eval ! ( condition) . as_boolean ( ) ? {
548+ if eval ! ( condition) . try_into_boolean ( ) ? {
531549 eval ! ( consequence)
532550 } else if let Some ( alternative) = alternative {
533551 eval ! ( alternative)
@@ -538,7 +556,9 @@ impl Expression {
538556
539557 IsUnset { a } => Boolean ( a. eval ( state) ?. is_none ( ) ) ,
540558
541- And { a, b } => Boolean ( eval ! ( a) . as_boolean ( ) ? && eval ! ( b) . as_boolean ( ) ?) ,
559+ And { a, b } => {
560+ Boolean ( eval ! ( a) . try_into_boolean ( ) ? && eval ! ( b) . try_into_boolean ( ) ?)
561+ } ,
542562 All { all } => {
543563 let mut all = all. iter ( ) ;
544564
@@ -547,12 +567,14 @@ impl Expression {
547567 break Boolean ( true ) ;
548568 } ;
549569
550- if !eval ! ( value) . as_boolean ( ) ? {
570+ if !eval ! ( value) . try_into_boolean ( ) ? {
551571 break Boolean ( false ) ;
552572 }
553573 }
554574 } ,
555- Or { a, b } => Boolean ( eval ! ( a) . as_boolean ( ) ? || eval ! ( b) . as_boolean ( ) ?) ,
575+ Or { a, b } => {
576+ Boolean ( eval ! ( a) . try_into_boolean ( ) ? || eval ! ( b) . try_into_boolean ( ) ?)
577+ } ,
556578 Any { any } => {
557579 let mut any = any. iter ( ) ;
558580
@@ -561,12 +583,12 @@ impl Expression {
561583 break Boolean ( false ) ;
562584 } ;
563585
564- if eval ! ( value) . as_boolean ( ) ? {
586+ if eval ! ( value) . try_into_boolean ( ) ? {
565587 break Boolean ( true ) ;
566588 }
567589 }
568590 } ,
569- Not { not } => Boolean ( !eval ! ( not) . as_boolean ( ) ?) ,
591+ Not { not } => Boolean ( !eval ! ( not) . try_into_boolean ( ) ?) ,
570592 } ) )
571593 }
572594}
0 commit comments