@@ -205,11 +205,13 @@ func (p *parser) parseValue(token Token) (Expression, error) {
205205 return nil , err
206206 }
207207 expression = coercedConstant {value : value }
208- } else {
209- return expression , nil
210208 }
211209 case "_lowercase_" :
212210 expression = coerceLowercase {value : expression }
211+ case "_string_" :
212+ expression = coerceString {value : expression }
213+ case "_number_" :
214+ expression = coerceNumber {value : expression }
213215 case "_uppercase_" :
214216 expression = coerceUppercase {value : expression }
215217 case "_title_" :
@@ -585,6 +587,72 @@ func (b between) Calculate(src []byte) (any, error) {
585587 }
586588}
587589
590+ var _ Expression = (* coerceNumber )(nil )
591+
592+ type coerceNumber struct {
593+ value Expression
594+ }
595+
596+ func (c coerceNumber ) Calculate (src []byte ) (any , error ) {
597+ value , err := c .value .Calculate (src )
598+ if err != nil {
599+ return nil , err
600+ }
601+
602+ switch v := value .(type ) {
603+ case string :
604+ f , err := strconv .ParseFloat (v , 64 )
605+ if err != nil {
606+ return nil , ErrUnsupportedCoerce {s : fmt .Sprintf ("unsupported type COERCE for value: %v to a number" , value )}
607+ }
608+ return f , nil
609+
610+ case float64 :
611+ return v , nil
612+
613+ case bool :
614+ if v {
615+ return 1.0 , nil
616+ } else {
617+ return 0.0 , nil
618+ }
619+
620+ case time.Time :
621+ return float64 (v .UnixNano ()), nil
622+
623+ default :
624+ return nil , ErrUnsupportedCoerce {s : fmt .Sprintf ("unsupported type COERCE for value: %v to a number" , value )}
625+ }
626+ }
627+
628+ var _ Expression = (* coerceString )(nil )
629+
630+ type coerceString struct {
631+ value Expression
632+ }
633+
634+ func (c coerceString ) Calculate (src []byte ) (any , error ) {
635+ value , err := c .value .Calculate (src )
636+ if err != nil {
637+ return nil , err
638+ }
639+
640+ switch v := value .(type ) {
641+ case nil :
642+ return "null" , nil
643+ case string :
644+ return v , nil
645+ case float64 :
646+ return strconv .FormatFloat (v , 'f' , - 1 , 64 ), nil
647+ case bool :
648+ return strconv .FormatBool (v ), nil
649+ case time.Time :
650+ return v .Format (time .RFC3339Nano ), nil
651+ default :
652+ return nil , ErrUnsupportedCoerce {s : fmt .Sprintf ("unsupported type COERCE for value: %v to a string" , value )}
653+ }
654+ }
655+
588656var _ Expression = (* coerceLowercase )(nil )
589657
590658type coerceLowercase struct {
@@ -601,7 +669,7 @@ func (c coerceLowercase) Calculate(src []byte) (any, error) {
601669 case string :
602670 return strings .ToLower (v ), nil
603671 default :
604- return nil , ErrUnsupportedCoerce {s : fmt .Sprintf ("unsupprted type COERCE for value: %v to a lowescase" , value )}
672+ return nil , ErrUnsupportedCoerce {s : fmt .Sprintf ("unsupported type COERCE for value: %v to a lowescase" , value )}
605673 }
606674}
607675
@@ -621,7 +689,7 @@ func (c coerceUppercase) Calculate(src []byte) (any, error) {
621689 case string :
622690 return strings .ToUpper (v ), nil
623691 default :
624- return nil , ErrUnsupportedCoerce {s : fmt .Sprintf ("unsupprted type COERCE for value: %v to a uppercase" , value )}
692+ return nil , ErrUnsupportedCoerce {s : fmt .Sprintf ("unsupported type COERCE for value: %v to a uppercase" , value )}
625693 }
626694}
627695
@@ -645,7 +713,7 @@ func (c coerceTitle) Calculate(src []byte) (any, error) {
645713 }
646714 return string (unicode .ToUpper (r )) + strings .ToLower (v [1 :]), nil
647715 default :
648- return nil , ErrUnsupportedCoerce {s : fmt .Sprintf ("unsupprted type COERCE for value: %v to a uppercase" , value )}
716+ return nil , ErrUnsupportedCoerce {s : fmt .Sprintf ("unsupported type COERCE for value: %v to a uppercase" , value )}
649717 }
650718}
651719
@@ -671,7 +739,7 @@ func (c coerceDateTime) Calculate(src []byte) (any, error) {
671739 }
672740 return t , nil
673741 default :
674- return nil , ErrUnsupportedCoerce {s : fmt .Sprintf ("unsupprted type COERCE for value: %v to a DateTime" , value )}
742+ return nil , ErrUnsupportedCoerce {s : fmt .Sprintf ("unsupported type COERCE for value: %v to a DateTime" , value )}
675743 }
676744}
677745
0 commit comments