1use crate::{Error, Value};23fn write_nix_obj_key_buf(4 k: &str,5 v: &Value,6 out: &mut String,7 indent: &mut String,8) -> Result<(), Error> {9 use std::fmt::Write;10 write!(out, "{}", k)?;11 match v {12 Value::Object(o) if o.len() == 1 => {13 let (k, v) = o.iter().next().unwrap();14 write!(out, ".")?;15 write_nix_obj_key_buf(k, v, out, indent)?;16 }17 v => {18 write!(out, " = ")?;19 write_nix_buf(v, out, indent)?;20 writeln!(out, ";")?;21 }22 }23 Ok(())24}2526fn write_nix_buf(value: &Value, out: &mut String, indent: &mut String) -> Result<(), Error> {27 use std::fmt::Write;28 match value {29 Value::Null => write!(out, "null")?,30 Value::Boolean(v) => write!(out, "{:?}", v)?,31 Value::Number(n) => write!(out, "{}", n)?,32 Value::String(s) => write!(out, "{:?}", s)?,33 Value::Array(a) => {34 if a.is_empty() {35 write!(out, "[ ]")?;36 } else {37 writeln!(out, "[")?;38 let old_len = indent.len();39 indent.push_str(" ");40 for item in a {41 write!(out, "{}", indent)?;42 write_nix_buf(item, out, indent)?;43 writeln!(out)?;44 }45 indent.truncate(old_len);46 write!(out, "{}]", indent)?;47 }48 }49 Value::Object(obj) => {50 if obj.is_empty() {51 write!(out, "{{ }}")?;52 } else {53 writeln!(out, "{{")?;54 let old_len = indent.len();55 indent.push_str(" ");56 for (k, v) in obj {57 write!(out, "{}", indent)?;58 write_nix_obj_key_buf(k, v, out, indent)?;59 }60 indent.truncate(old_len);61 write!(out, "{}}}", indent)?;62 }63 }64 };65 Ok(())66}6768pub fn write_nix(value: &Value) -> Result<String, Error> {69 let mut out = String::new();70 let mut indent = String::new();7172 write_nix_buf(value, &mut out, &mut indent)?;73 Ok(out)74}