hocon 0.9.0

Reads HOCON configuration files
Documentation
use std::env;

use serde_json::{Number, Value};

use hocon::{Error, Hocon, HoconLoader};

fn hocon_to_json(hocon: Hocon) -> Option<Value> {
    match hocon {
        Hocon::Boolean(b) => Some(Value::Bool(b)),
        Hocon::Integer(i) => Some(Value::Number(Number::from(i))),
        Hocon::Real(f) => Some(Value::Number(
            Number::from_f64(f).unwrap_or(Number::from(0)),
        )),
        Hocon::String(s) => Some(Value::String(s)),
        Hocon::Array(vec) => Some(Value::Array(
            vec.into_iter()
                .map(hocon_to_json)
                .filter_map(|i| i)
                .collect(),
        )),
        Hocon::Hash(map) => Some(Value::Object(
            map.into_iter()
                .map(|(k, v)| (k, hocon_to_json(v)))
                .filter_map(|(k, v)| v.map(|v| (k, v)))
                .collect(),
        )),
        Hocon::Null => Some(Value::Null),
        Hocon::BadValue(_) => None,
    }
}

fn parse_to_json(path: &str) -> Result<String, Error> {
    let hocon = dbg!(HoconLoader::new().no_system().load_file(path)?.hocon())?;
    let json: Option<_> = hocon_to_json(hocon);
    Ok(
        serde_json::to_string_pretty(&json).map_err(|e| Error::Deserialization {
            message: e.to_string(),
        })?,
    )
}

fn main() {
    match env::args().nth(1) {
        None => println!("please provide a HOCON file"),
        Some(file) => println!(
            "{}",
            dbg!(parse_to_json(&file).unwrap_or_else(|_| String::from("")))
        ),
    }
}