The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
# Copyright (C) 2007-2012, Parrot Foundation.

=head1 DESCRIPTION

Provides a simple wrapper to read and write JSON config files.

=cut

.namespace [ 'Config' ; 'JSON' ]

=head2 ReadConfig(filename)

Given a filename, parse the file containing valid JSON and return a
PMC containing the data.

If the data is not valid, an exception will be thrown.

=cut

.sub 'ReadConfig'
    .param string filename

    # Slurp in the file
    .local string text
    .local pmc fh

    fh = new ['FileHandle']
    fh.'open'(filename, 'r')
    if fh goto slurp_file
    $P0 = new 'Exception'
    $S0 = concat "Can't open file: ", filename
    $P0 = $S0
    throw $P0

  slurp_file:
    fh.'encoding'('utf8')
    text = fh.'readall'()

    # Convert the text to an object and return it.
    .local pmc json, code
    load_language 'data_json'
    json = compreg 'data_json'
    code = json.'compile'(text)
    .tailcall code()
.end

=head2 WriteConfig(config, filename, ?:compact)

Given a PMC and a filename, render the pmc as JSON and store the contents
into the named file, overwriting the existing contents.

Any exceptions generated by the conversion or writing to the file will
be passed through.

If a true value is passed for the optional named parameter 'compact', then
the rendered JSON will not be formatted. The default is false.

=cut

.sub 'WriteConfig'
    .param pmc    config
    .param string filename
    .param int    compact     :optional :named('compact')
    .param int    has_compact :opt_flag

    if has_compact goto done_options
    compact = 0

  done_options:
    .local int expanded
    expanded = not compact

    # render the object as a string.
    load_bytecode 'JSON.pbc'
    .local string output
    output = _json( config, expanded )

    # write out the file..
    $P1 = new ['FileHandle']
    $P1.'open'(filename, 'w')
    print $P1, output
    print $P1, "\n"
    $P1.'close'()

.end

# Local Variables:
#   mode: pir
#   fill-column: 100
# End:
# vim: expandtab shiftwidth=4 ft=pir: