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    )