66use std:: collections:: BTreeSet ;
77
88use crate :: component_category:: CategoryPredicates ;
9+ use crate :: graph:: formulas:: expr:: Expr ;
10+ use crate :: graph:: formulas:: Formula ;
911use crate :: { ComponentGraph , Edge , Error , Node } ;
1012
1113pub ( crate ) struct BatteryFormulaBuilder < ' a , N , E >
@@ -47,14 +49,14 @@ where
4749 /// This is the sum of all battery_inverters in the graph. If the
4850 /// battery_ids are provided, only the batteries with the given ids are
4951 /// included in the formula.
50- pub fn build ( self ) -> Result < String , Error > {
52+ pub fn build ( self ) -> Result < Formula , Error > {
5153 if self . inverter_ids . is_empty ( ) {
52- return Ok ( " 0.0" . to_string ( ) ) ;
54+ return Ok ( Formula :: new ( Expr :: number ( 0.0 ) ) ) ;
5355 }
5456
5557 self . graph
5658 . fallback_expr ( self . inverter_ids , false )
57- . map ( |expr| expr . to_string ( ) )
59+ . map ( Formula :: new )
5860 }
5961
6062 fn find_inverter_ids (
@@ -104,7 +106,7 @@ mod tests {
104106 builder. connect ( grid, grid_meter) ;
105107
106108 let graph = builder. build ( None ) ?;
107- let formula = graph. battery_formula ( None ) ?;
109+ let formula = graph. battery_formula ( None ) ?. to_string ( ) ;
108110 assert_eq ! ( formula, "0.0" ) ;
109111
110112 // Add a battery meter with one inverter and one battery.
@@ -115,7 +117,7 @@ mod tests {
115117 assert_eq ! ( meter_bat_chain. component_id( ) , 2 ) ;
116118
117119 let graph = builder. build ( None ) ?;
118- let formula = graph. battery_formula ( None ) ?;
120+ let formula = graph. battery_formula ( None ) ?. to_string ( ) ;
119121 assert_eq ! ( formula, "COALESCE(#3, #2, 0.0)" ) ;
120122
121123 // Add a second battery meter with one inverter and two batteries.
@@ -125,18 +127,22 @@ mod tests {
125127 assert_eq ! ( meter_bat_chain. component_id( ) , 5 ) ;
126128
127129 let graph = builder. build ( None ) ?;
128- let formula = graph. battery_formula ( None ) ?;
130+ let formula = graph. battery_formula ( None ) ?. to_string ( ) ;
129131 assert_eq ! ( formula, "COALESCE(#3, #2, 0.0) + COALESCE(#6, #5, 0.0)" ) ;
130132
131- let formula = graph. battery_formula ( Some ( BTreeSet :: from ( [ 4 ] ) ) ) ?;
133+ let formula = graph
134+ . battery_formula ( Some ( BTreeSet :: from ( [ 4 ] ) ) ) ?
135+ . to_string ( ) ;
132136 assert_eq ! ( formula, "COALESCE(#3, #2, 0.0)" ) ;
133137
134- let formula = graph. battery_formula ( Some ( BTreeSet :: from ( [ 7 , 8 ] ) ) ) ?;
138+ let formula = graph
139+ . battery_formula ( Some ( BTreeSet :: from ( [ 7 , 8 ] ) ) ) ?
140+ . to_string ( ) ;
135141 assert_eq ! ( formula, "COALESCE(#6, #5, 0.0)" ) ;
136142
137143 let formula = graph
138- . battery_formula ( Some ( BTreeSet :: from ( [ 4 , 8 , 7 ] ) ) )
139- . unwrap ( ) ;
144+ . battery_formula ( Some ( BTreeSet :: from ( [ 4 , 8 , 7 ] ) ) ) ?
145+ . to_string ( ) ;
140146 assert_eq ! ( formula, "COALESCE(#3, #2, 0.0) + COALESCE(#6, #5, 0.0)" ) ;
141147
142148 // Add a third battery meter with two inverters with two connected batteries.
@@ -146,7 +152,7 @@ mod tests {
146152 assert_eq ! ( meter_bat_chain. component_id( ) , 9 ) ;
147153
148154 let graph = builder. build ( None ) ?;
149- let formula = graph. battery_formula ( None ) ?;
155+ let formula = graph. battery_formula ( None ) ?. to_string ( ) ;
150156 assert_eq ! (
151157 formula,
152158 concat!(
@@ -157,8 +163,8 @@ mod tests {
157163 ) ;
158164
159165 let formula = graph
160- . battery_formula ( Some ( BTreeSet :: from ( [ 12 , 13 ] ) ) )
161- . unwrap ( ) ;
166+ . battery_formula ( Some ( BTreeSet :: from ( [ 12 , 13 ] ) ) ) ?
167+ . to_string ( ) ;
162168 assert_eq ! (
163169 formula,
164170 "COALESCE(#11 + #10, #9, COALESCE(#11, 0.0) + COALESCE(#10, 0.0))"
@@ -171,7 +177,7 @@ mod tests {
171177 assert_eq ! ( meter_pv_chain. component_id( ) , 14 ) ;
172178
173179 let graph = builder. build ( None ) ?;
174- let formula = graph. battery_formula ( None ) ?;
180+ let formula = graph. battery_formula ( None ) ?. to_string ( ) ;
175181 assert_eq ! (
176182 formula,
177183 concat!(
@@ -208,7 +214,7 @@ mod tests {
208214 allow_unspecified_inverters : true ,
209215 ..Default :: default ( )
210216 } ) ) ?;
211- let formula = graph. battery_formula ( None ) ?;
217+ let formula = graph. battery_formula ( None ) ?. to_string ( ) ;
212218 assert_eq ! (
213219 formula,
214220 concat!(
@@ -220,22 +226,26 @@ mod tests {
220226 ) ;
221227
222228 let formula = graph
223- . battery_formula ( Some ( BTreeSet :: from ( [ 19 , 21 ] ) ) )
224- . unwrap ( ) ;
229+ . battery_formula ( Some ( BTreeSet :: from ( [ 19 , 21 ] ) ) ) ?
230+ . to_string ( ) ;
225231 assert_eq ! (
226232 formula,
227233 "COALESCE(#20 + #18, #17, COALESCE(#20, 0.0) + COALESCE(#18, 0.0))"
228234 ) ;
229235
230- let formula = graph. battery_formula ( Some ( BTreeSet :: from ( [ 19 ] ) ) ) . unwrap ( ) ;
236+ let formula = graph
237+ . battery_formula ( Some ( BTreeSet :: from ( [ 19 ] ) ) ) ?
238+ . to_string ( ) ;
231239 assert_eq ! ( formula, "COALESCE(#18, 0.0)" ) ;
232240
233- let formula = graph. battery_formula ( Some ( BTreeSet :: from ( [ 21 ] ) ) ) . unwrap ( ) ;
241+ let formula = graph
242+ . battery_formula ( Some ( BTreeSet :: from ( [ 21 ] ) ) ) ?
243+ . to_string ( ) ;
234244 assert_eq ! ( formula, "COALESCE(#20, 0.0)" ) ;
235245
236246 let formula = graph
237- . battery_formula ( Some ( BTreeSet :: from ( [ 4 , 12 , 13 , 19 ] ) ) )
238- . unwrap ( ) ;
247+ . battery_formula ( Some ( BTreeSet :: from ( [ 4 , 12 , 13 , 19 ] ) ) ) ?
248+ . to_string ( ) ;
239249 assert_eq ! (
240250 formula,
241251 concat!(
0 commit comments