///|
/// Convert a parsed TOML document to a plain JSON value: tables become
/// objects, arrays stay arrays, and datetimes become their TOML string
/// form. Integers keep their exact 64-bit decimal representation, and
/// non-finite floats become the strings "nan"/"inf"/"-inf" since JSON
/// cannot represent them as numbers.
fn to_json(value : @toml_lib.TomlValue) -> Json {
  match value {
    TomlString(s) => Json::string(s)
    TomlInteger(i) => Json::number(i.to_double(), repr=i.to_string())
    TomlFloat(f) =>
      if f.is_nan() {
        Json::string("nan")
      } else if f.is_inf() {
        Json::string(if f < 0.0 { "-inf" } else { "inf" })
      } else {
        Json::number(f)
      }
    TomlBoolean(b) => Json::boolean(b)
    TomlDateTime(_) => {
      let (_, s) = value.datetime_info().unwrap()
      Json::string(s)
    }
    TomlArray(arr) => Json::array([ for v in arr => to_json(v) ])
    TomlTable(table) =>
      Json::object(Map::from_array([ for k, v in table => (k, to_json(v)) ]))
  }
}