git.delta.rocks / jrsonnet / refs/commits / f965cc12b1e6

difftreelog

source

crates/nixlike/src/to_string.rs1.6 KiBsourcehistory
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}