22
33use std:: marker:: PhantomData ;
44
5+ use itertools:: Itertools ;
56use serde:: { Deserialize , Deserializer , Serialize } ;
67
78mod interpolation;
@@ -10,6 +11,7 @@ mod match_expr;
1011pub use match_expr:: * ;
1112
1213mod value;
14+ use serde_json:: Value ;
1315pub use value:: { ExprGeometryType , ExprValue } ;
1416
1517use crate :: Color ;
@@ -118,20 +120,42 @@ impl From<f64> for Expr {
118120 }
119121}
120122
123+ impl From < String > for Expr {
124+ fn from ( value : String ) -> Self {
125+ Expr :: Literal ( value. into ( ) )
126+ }
127+ }
128+
129+ impl From < bool > for Expr {
130+ fn from ( value : bool ) -> Self {
131+ Expr :: Literal ( value. into ( ) )
132+ }
133+ }
134+
121135impl < ' de , Out > Deserialize < ' de > for TypedExpr < Out > {
122136 fn deserialize < D : Deserializer < ' de > > ( deserializer : D ) -> Result < Self , D :: Error > {
123137 // Buffer into a generic value so we can inspect the shape without consuming the input.
124138 let value = serde_json:: Value :: deserialize ( deserializer) ?;
125139
126- if let serde_json:: Value :: String ( ref s) = value {
127- return parser:: parse_expr ( s)
128- . map ( |( _, expr) | expr. into ( ) )
129- . map_err ( |e| serde:: de:: Error :: custom ( format ! ( "expression parse error: {e}" ) ) ) ;
130- }
140+ let expr = match value {
141+ Value :: Number ( v) => v
142+ . as_f64 ( )
143+ . ok_or_else ( || serde:: de:: Error :: custom ( format ! ( "invalid number value: {v}" ) ) ) ?
144+ . into ( ) ,
145+ Value :: Bool ( v) => v. into ( ) ,
146+ Value :: Null => ExprValue :: Null . into ( ) ,
147+ Value :: String ( s) => parser:: parse_expr ( & s) . map_err ( |e| {
148+ let errors = e. into_iter ( ) . map ( |v| v. to_string ( ) ) ;
149+ let errors = Itertools :: intersperse ( errors, ", " . to_string ( ) ) ;
150+ serde:: de:: Error :: custom ( format ! (
151+ "expression parse error: {}" ,
152+ errors. collect:: <String >( ) ,
153+ ) )
154+ } ) ?,
155+ v => Expr :: deserialize ( v) . map_err ( serde:: de:: Error :: custom) ?,
156+ } ;
131157
132- Expr :: deserialize ( value)
133- . map ( Into :: into)
134- . map_err ( serde:: de:: Error :: custom)
158+ Ok ( expr. into ( ) )
135159 }
136160}
137161
@@ -236,6 +260,13 @@ mod tests {
236260 ) ;
237261 }
238262
263+ #[ test]
264+ fn deserialize_expr_from_num ( ) {
265+ let json = "42" ;
266+ let expr: NumExpr = serde_json:: from_str ( json) . unwrap ( ) ;
267+ assert_eq ! ( expr. 0 , Expr :: Literal ( ExprValue :: Number ( 42.0 ) ) ) ;
268+ }
269+
239270 #[ test]
240271 fn deserialize_expr_from_object ( ) {
241272 let json = r#"{"Get": "kind"}"# ;
0 commit comments