libconfig-rs 4.0.0

libconfig parser in rust
Documentation
use crate::{ArrayType, Value};
use std::fmt::Write;

fn indent(w: &mut impl Write, indentation_level: i32) {
    for _ in 0..indentation_level {
        write!(w, " ").unwrap();
    }
}

pub fn print(w: &mut impl Write, value: &Value, indentation_level: i32) {
    match value {
        Value::Bool(b) => {
            if *b {
                write!(w, "true").unwrap();
            } else {
                write!(w, "false").unwrap();
            }
        }
        Value::Int(i) => {
            write!(w, "{i}").unwrap();
        }
        Value::Float(f) => {
            write!(w, "{f:?}").unwrap();
        }
        Value::String(s) => {
            write!(w, "{s:?}").unwrap();
        }
        Value::Array(a, array_type) => {
            if *array_type == ArrayType::List {
                write!(w, "( ").unwrap();
            } else {
                write!(w, "[ ").unwrap();
            }
            for (i, v) in a.iter().enumerate() {
                print(w, v, indentation_level + 4);
                if i != a.len() - 1 {
                    write!(w, ", ").unwrap();
                }
            }
            if *array_type == ArrayType::List {
                write!(w, " )").unwrap();
            } else {
                write!(w, " ]").unwrap();
            }
        }
        Value::Object(o) => {
            writeln!(w, "{{").unwrap();
            for (name, v) in o {
                indent(w, indentation_level);
                write!(w, "{name} : ").unwrap();
                print(w, v, indentation_level + 4);
                writeln!(w, ";").unwrap();
            }
            indent(w, indentation_level - 4);
            write!(w, "}}").unwrap();
        }
    }
}