1- use anyhow:: { Result , anyhow , Context } ;
1+ use anyhow:: { Context , Result , anyhow } ;
22use serde:: { Deserialize , Deserializer , Serialize , Serializer , de:: DeserializeOwned } ;
33use serde_json:: { Map as JsonMap , Value , value:: Index } ;
44use std:: fmt:: { Debug , Display } ;
@@ -60,14 +60,22 @@ where
6060 let data = ez_eval ( & expr, & mut namespace) ?;
6161 result. push ( Value :: from ( data) ) ;
6262 }
63- serde_json:: from_value ( result. into ( ) )
64- . with_context ( || format ! ( "failed to deserialize generated list for type '{}'" , value_type) )
63+ serde_json:: from_value ( result. into ( ) ) . with_context ( || {
64+ format ! (
65+ "failed to deserialize generated list for type '{}'" ,
66+ value_type
67+ )
68+ } )
6569 }
6670 "g-number" => {
6771 let expr: String = must_translate ( & mut value, map, "expr" ) ?;
6872 let data = ez_eval ( & expr, & mut fasteval:: EmptyNamespace { } ) ?;
69- serde_json:: from_value ( data. into ( ) )
70- . with_context ( || format ! ( "failed to deserialize generated number for type '{}'" , value_type) )
73+ serde_json:: from_value ( data. into ( ) ) . with_context ( || {
74+ format ! (
75+ "failed to deserialize generated number for type '{}'" ,
76+ value_type
77+ )
78+ } )
7179 }
7280 "g-range" => {
7381 let begin: f64 = must_translate ( & mut value, map, "begin" ) ?;
@@ -86,15 +94,23 @@ where
8694 result. push ( Value :: from ( current) ) ;
8795 current += step;
8896 }
89- serde_json:: from_value ( result. into ( ) )
90- . with_context ( || format ! ( "failed to deserialize generated range for type '{}'" , value_type) )
97+ serde_json:: from_value ( result. into ( ) ) . with_context ( || {
98+ format ! (
99+ "failed to deserialize generated range for type '{}'" ,
100+ value_type
101+ )
102+ } )
91103 }
92104 "g-repeat" => {
93105 let val: Value = must_translate ( & mut value, map, "value" ) ?;
94106 let count: u64 = must_translate ( & mut value, map, "count" ) ?;
95107 let result = std:: iter:: repeat_n ( val, count as usize ) . collect :: < Vec < _ > > ( ) ;
96- serde_json:: from_value ( result. into ( ) )
97- . with_context ( || format ! ( "failed to deserialize repeated values for type '{}'" , value_type) )
108+ serde_json:: from_value ( result. into ( ) ) . with_context ( || {
109+ format ! (
110+ "failed to deserialize repeated values for type '{}'" ,
111+ value_type
112+ )
113+ } )
98114 }
99115 "g-linear" => {
100116 let begin: f64 = must_translate ( & mut value, map, "begin" ) ?;
@@ -113,8 +129,54 @@ where
113129 result. push ( Value :: from ( val) ) ;
114130 }
115131 }
116- serde_json:: from_value ( result. into ( ) )
117- . with_context ( || format ! ( "failed to deserialize linear spaced values for type '{}'" , value_type) )
132+ serde_json:: from_value ( result. into ( ) ) . with_context ( || {
133+ format ! (
134+ "failed to deserialize linear spaced values for type '{}'" ,
135+ value_type
136+ )
137+ } )
138+ }
139+ "if" => {
140+ let condition: String = must_translate ( & mut value, map, "condition" ) ?;
141+ let true_val: Value = must_translate ( & mut value, map, "true" ) ?;
142+ let false_val: Value = must_translate ( & mut value, map, "false" ) ?;
143+
144+ // Evaluate condition using fasteval
145+ let mut namespace = fasteval:: StrToF64Namespace :: new ( ) ;
146+ // We need to check if the condition contains 'i' variable
147+ // For simplicity, assume it's a boolean expression that evaluates to non-zero for true
148+ let result = ez_eval ( & condition, & mut namespace) ?;
149+ let selected = if result != 0.0 { true_val } else { false_val } ;
150+
151+ // Parse the selected value according to its type
152+ if !selected. is_object ( ) {
153+ serde_json:: from_value :: < T > ( selected. clone ( ) )
154+ . with_context ( || "failed to deserialize non-object if result" )
155+ } else {
156+ // If it's an object, it might be another generator
157+ Self :: parse_map ( map, selected)
158+ }
159+ }
160+ "time" => {
161+ // Simple time generator: produce timestamps as strings
162+ let start: String = must_translate ( & mut value, map, "start" ) ?;
163+ let end: String = must_translate ( & mut value, map, "end" ) ?;
164+ let _interval: String = must_translate ( & mut value, map, "interval" ) ?;
165+ let _format: Option < String > = if value. get ( "format" ) . is_some ( ) {
166+ Some ( must_translate ( & mut value, map, "format" ) ?)
167+ } else {
168+ None
169+ } ;
170+
171+ // For now, just return the start and end as strings
172+ // In a real implementation, you'd parse dates and generate a series
173+ let result = vec ! [ Value :: from( start. clone( ) ) , Value :: from( end. clone( ) ) ] ;
174+ serde_json:: from_value ( result. into ( ) ) . with_context ( || {
175+ format ! (
176+ "failed to deserialize time values for type '{}'" ,
177+ value_type
178+ )
179+ } )
118180 }
119181 _ => Err ( anyhow ! ( "unknown type `{}`" , value_type) ) ,
120182 }
0 commit comments