git.delta.rocks / jrsonnet / refs/commits / 001a19c0aae9

difftreelog

feat(nixlike) formatted output

pssowksxYaroslav Bolyukin2025-10-01parent: #8fa5c73.patch.diff
in: trunk

1 file changed

modifiedcrates/nixlike/src/to_string.rsdiffbeforeafterboth
22
3pub 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}
1010
11fn 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();
1616
17 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}
3939
40fn write_padding(out: &mut String, padding: &usize) {
41 for _ in 0..*padding {
42 out.push_str(" ");
43 }
44}
45
46pub 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 &ele
47 // '' 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 condition
59 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}
6478
65fn 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 }
97119
98pub 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 out
102}124}
103125