1:- module(ap_io, 2 [ save_scenario/2, 3 load_scenario/2, 4 export_report_json/2, 5 ensure_extension/3 6 ]). 7 8:- use_module(library(http/json)). 9:- use_module(ap_validation). 10 11save_scenario(File0, Scenario0) :- 12 ensure_extension(File0, '.ap.pl', File), 13 ap_validation:normalized_scenario(Scenario0, Scenario), 14 setup_call_cleanup( 15 open(File, write, Out, [encoding(utf8)]), 16 write_term(Out, Scenario, [quoted(true), fullstop(true), nl(true)]), 17 close(Out)). 18 19load_scenario(File, Scenario) :- 20 setup_call_cleanup( 21 open(File, read, In, [encoding(utf8)]), 22 read_term(In, Term, [syntax_errors(error)]), 23 close(In)), 24 ( is_dict(Term) -> ap_validation:normalized_scenario(Term, Scenario) 25 ; throw(error(type_error(scenario_dict, Term), load_scenario/2)) 26 ). 27 28export_report_json(File0, Report0, File) :- 29 ensure_extension(File0, '.json', File), 30 json_safe_report(Report0, Report), 31 setup_call_cleanup( 32 open(File, write, Out, [encoding(utf8)]), 33 json_write_dict(Out, Report, [width(0)]), 34 close(Out)). 35 36json_safe_report(Report0, Report) :- 37 ( is_dict(Report0), del_dict(contributions, Report0, _, R1) -> Report = R1 38 ; Report = Report0 39 ). 40 41export_report_json(File0, Report) :- export_report_json(File0, Report, _). 42 43ensure_extension(File0, Ext, File) :- 44 string(File0), !, 45 atom_string(A0, File0), 46 ensure_extension(A0, Ext, File). 47ensure_extension(File0, Ext, File) :- 48 atom(File0), 49 ( sub_atom(File0, _, _, 0, Ext) -> File = File0 50 ; atom_concat(File0, Ext, File) 51 )