difftreelog
feat(nixlike) formatted output
in: trunk
1 file changed
crates/nixlike/src/to_string.rsdiffbeforeafterboth223pub fn write_identifier(k: &str, out: &mut String) {3pub fn write_identifier(k: &str, out: &mut String) {4 if k.contains(['.', '\'', '\"', '\\', '\n', '\t', '\r', '$']) {4 if k.contains(['.', '\'', '\"', '\\', '\n', '\t', '\r', '$']) {5 write_nix_str(k, out);5 write_nix_str_singleline(k, out);6 } else {6 } else {7 out.push_str(k);7 out.push_str(k);8 }8 }9}9}101011fn write_nix_obj_key_buf(k: &str, v: &Value, out: &mut String) {11fn write_nix_obj_key_buf(k: &str, v: &Value, out: &mut String, padding: &mut usize) {12 write_identifier(k, out);12 write_identifier(k, out);13 match v {13 match v {14 Value::Object(o) if o.len() == 1 => {14 Value::Object(o) if o.len() == 1 => {15 let (k, v) = o.iter().next().unwrap();15 let (k, v) = o.iter().next().unwrap();161617 out.push('.');17 out.push('.');18 write_nix_obj_key_buf(k, v, out);18 write_nix_obj_key_buf(k, v, out, padding);19 }19 }20 v => {20 v => {21 out.push_str(" = ");21 out.push_str(" = ");22 write_nix_buf(v, out);22 write_nix_buf(v, out, padding);23 out.push(';');23 out.push(';');24 }24 }25 }25 }37 )37 )38}38}393940fn write_padding(out: &mut String, padding: &usize) {41 for _ in 0..*padding {42 out.push_str(" ");43 }44}4546pub fn write_nix_str_singleline(str: &str, out: &mut String) {47 out.push_str(&escape_string(str))48}40pub fn write_nix_str(str: &str, out: &mut String) {49pub fn write_nix_str(str: &str, out: &mut String, padding: &mut usize) {41 if str.ends_with('\n') {50 if str.ends_with('\n') {42 out.push_str("''");51 out.push_str("''");52 *padding += 1;43 for ele in str.split('\n') {53 for ele in str[0..str.len() - 1].split('\n') {44 out.push('\n');54 out.push('\n');55 write_padding(out, padding);45 out.push_str(56 out.push_str(46 &ele57 &ele47 // '' is escaped with '58 // '' is escaped with '55 .replace('\t', "''\\t"),66 .replace('\t', "''\\t"),56 );67 );57 }68 }69 out.push('\n');70 *padding -= 1;71 write_padding(out, padding);58 // Final newline is assumed due to str.ends_with condition72 // Final newline is assumed due to str.ends_with condition59 out.push_str("''");73 out.push_str("''");60 } else {74 } else {61 out.push_str(&escape_string(str))75 write_nix_str_singleline(str, out);62 }76 }63}77}647865fn write_nix_buf(value: &Value, out: &mut String) {79fn write_nix_buf(value: &Value, out: &mut String, padding: &mut usize) {66 match value {80 match value {67 Value::Null => out.push_str("null"),81 Value::Null => out.push_str("null"),68 Value::Boolean(v) => out.push_str(if *v { "true" } else { "false" }),82 Value::Boolean(v) => out.push_str(if *v { "true" } else { "false" }),69 Value::Number(n) => out.push_str(&format!("{}", n)),83 Value::Number(n) => out.push_str(&format!("{n}")),70 Value::String(s) => write_nix_str(s, out),84 Value::String(s) => write_nix_str(s, out, padding),71 Value::Array(a) => {85 Value::Array(a) => {72 if a.is_empty() {86 if a.is_empty() {73 out.push_str("[ ]");87 out.push_str("[ ]");74 } else {88 } else {75 out.push('[');89 out.push_str("[\n");90 *padding += 1;76 for item in a {91 for item in a {92 write_padding(out, padding);77 write_nix_buf(item, out);93 write_nix_buf(item, out, padding);78 out.push('\n');94 out.push('\n');79 }95 }96 *padding -= 1;97 write_padding(out, padding);80 out.push(']');98 out.push(']');81 }99 }82 }100 }83 Value::Object(obj) => {101 Value::Object(obj) => {84 if obj.is_empty() {102 if obj.is_empty() {85 out.push_str("{ }")103 out.push_str("{ }")86 } else {104 } else {87 out.push('{');105 out.push_str("{\n");106 *padding += 1;88 for (k, v) in obj {107 for (k, v) in obj {108 write_padding(out, padding);89 write_nix_obj_key_buf(k, v, out);109 write_nix_obj_key_buf(k, v, out, padding);90 out.push('\n');110 out.push('\n');91 }111 }112 *padding -= 1;113 write_padding(out, padding);92 out.push('}');114 out.push('}');93 }115 }94 }116 }9711998pub fn write_nix(value: &Value) -> String {120pub fn write_nix(value: &Value) -> String {99 let mut out = String::new();121 let mut out = String::new();100 write_nix_buf(value, &mut out);122 write_nix_buf(value, &mut out, &mut 0);101 out123 out102}124}103125