use indexmap::IndexMap;
#[derive(Debug, PartialEq, Clone)]
pub enum VdfValue {
String(String),
Object(IndexMap<String, Box<VdfValue>>),
}
impl VdfValue {
pub fn to_string(&self) -> String {
self.vdf_to_string(0)
}
fn vdf_to_string(&self, indent: usize) -> String {
let mut result = String::new();
let indent_str = "\t".repeat(indent);
match self {
VdfValue::String(s) => {
result.push_str(&format!("\"{}\"", s));
}
VdfValue::Object(map) => {
for (key, val) in map {
result.push_str(&format!("{}\"{}\"", indent_str, key));
match &**val {
VdfValue::String(s) => {
result.push_str(&format!("\t\t\"{}\"\n", escape_string(s)));
}
VdfValue::Object(_) => {
result.push_str(&format!("\n{}{{\n", indent_str));
result.push_str(&val.vdf_to_string(indent + 1).as_str());
result.push_str(&format!("{}}}\n", indent_str));
}
}
}
}
}
result
}
}
fn escape_string(s: &str) -> String {
let mut result = String::new();
for c in s.chars() {
match c {
'"' => result.push_str("\\\""), '\\' => result.push_str("\\\\"), '\n' => result.push_str("\\n"), '\r' => result.push_str("\\r"), '\t' => result.push_str("\\t"), _ => result.push(c), }
}
result
}