@@ -4,6 +4,7 @@ use crate::expr::Expr;
44use crate :: rules:: registry:: ReductionOverhead ;
55use crate :: rules:: ReductionGraph ;
66use crate :: traits:: Problem ;
7+ use serde:: de:: DeserializeOwned ;
78use serde:: { Deserialize , Serialize } ;
89use std:: collections:: BTreeMap ;
910use std:: env;
@@ -118,19 +119,15 @@ impl ModelExample {
118119/// Canonical exported database of rule examples.
119120#[ derive( Serialize , Deserialize , Clone , Debug , PartialEq ) ]
120121pub struct RuleDb {
121- pub version : u32 ,
122122 pub rules : Vec < RuleExample > ,
123123}
124124
125125/// Canonical exported database of model examples.
126126#[ derive( Serialize , Deserialize , Clone , Debug , PartialEq ) ]
127127pub struct ModelDb {
128- pub version : u32 ,
129128 pub models : Vec < ModelExample > ,
130129}
131130
132- pub const EXAMPLE_DB_VERSION : u32 = 1 ;
133-
134131#[ derive( Serialize , Deserialize , Clone , Debug , PartialEq ) ]
135132pub struct SampleEval {
136133 pub config : Vec < usize > ,
@@ -198,6 +195,50 @@ fn write_json_file<T: Serialize>(dir: &Path, name: &str, payload: &T) {
198195 println ! ( "Exported: {}" , path. display( ) ) ;
199196}
200197
198+ fn parse_json_lines < T > ( json_lines : & str , label : & str ) -> Vec < T >
199+ where
200+ T : DeserializeOwned ,
201+ {
202+ json_lines
203+ . lines ( )
204+ . enumerate ( )
205+ . filter_map ( |( index, line) | {
206+ let line = line. trim ( ) ;
207+ if line. is_empty ( ) {
208+ return None ;
209+ }
210+ Some ( serde_json:: from_str ( line) . unwrap_or_else ( |err| {
211+ panic ! ( "Failed to parse {label} fixture line {}: {err}" , index + 1 )
212+ } ) )
213+ } )
214+ . collect ( )
215+ }
216+
217+ fn write_json_lines_file < T : Serialize > ( dir : & Path , name : & str , values : & [ T ] ) {
218+ fs:: create_dir_all ( dir) . expect ( "Failed to create examples directory" ) ;
219+ let path = dir. join ( format ! ( "{name}.json" ) ) ;
220+ let mut json_lines = String :: new ( ) ;
221+ for value in values {
222+ let line = serde_json:: to_string ( value) . expect ( "Failed to serialize JSON line" ) ;
223+ json_lines. push_str ( & line) ;
224+ json_lines. push ( '\n' ) ;
225+ }
226+ fs:: write ( & path, json_lines) . expect ( "Failed to write example JSON lines" ) ;
227+ println ! ( "Exported: {}" , path. display( ) ) ;
228+ }
229+
230+ pub ( crate ) fn parse_rule_db_json_lines ( json_lines : & str ) -> RuleDb {
231+ RuleDb {
232+ rules : parse_json_lines ( json_lines, "rule" ) ,
233+ }
234+ }
235+
236+ pub ( crate ) fn parse_model_db_json_lines ( json_lines : & str ) -> ModelDb {
237+ ModelDb {
238+ models : parse_json_lines ( json_lines, "model" ) ,
239+ }
240+ }
241+
201242/// Write a merged rule example JSON file.
202243pub fn write_rule_example_to ( dir : & Path , name : & str , example : & RuleExample ) {
203244 write_json_file ( dir, name, example) ;
@@ -220,12 +261,12 @@ pub fn write_model_example(name: &str, example: &ModelExample) {
220261
221262/// Write the canonical rule database to `rules.json`.
222263pub fn write_rule_db_to ( dir : & Path , db : & RuleDb ) {
223- write_json_file ( dir, "rules" , db ) ;
264+ write_json_lines_file ( dir, "rules" , & db . rules ) ;
224265}
225266
226267/// Write the canonical model database to `models.json`.
227268pub fn write_model_db_to ( dir : & Path , db : & ModelDb ) {
228- write_json_file ( dir, "models" , db ) ;
269+ write_json_lines_file ( dir, "models" , & db . models ) ;
229270}
230271
231272#[ cfg( test) ]
0 commit comments