difftreelog
feat dprint support
in: trunk
2 files changed
crates/nixlike/src/lib.rsdiffbeforeafterboth--- a/crates/nixlike/src/lib.rs
+++ b/crates/nixlike/src/lib.rs
@@ -101,13 +101,13 @@
D::deserialize(value)
}
-pub fn serialize_value_pretty(value: Value) -> Result<String, Error> {
+pub fn serialize_value_pretty(value: Value) -> String {
to_string::write_nix(&value)
}
pub fn serialize<S: Serialize>(value: S) -> Result<String, Error> {
let value: Value = value.serialize(MySerialize)?;
- serialize_value_pretty(value)
+ Ok(serialize_value_pretty(value))
}
#[test]
crates/nixlike/src/to_string.rsdiffbeforeafterboth1use 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}1use crate::Value;2use dprint_core::formatting::{3 condition_resolvers, conditions, format, ConditionResolverContext, Info, PrintItems,4 PrintOptions, Signal,5};67fn write_nix_obj_key_buf(k: &str, v: &Value, out: &mut PrintItems) {8 out.push_str(k);9 match v {10 Value::Object(o) if o.len() == 1 => {11 let (k, v) = o.iter().next().unwrap();1213 out.push_str(".");14 write_nix_obj_key_buf(k, v, out);15 }16 v => {17 out.push_str(" = ");18 write_nix_buf(v, out);19 out.push_str(";");20 }21 }22}2324fn write_nix_buf(value: &Value, out: &mut PrintItems) {25 match value {26 Value::Null => out.push_str("null"),27 Value::Boolean(v) => out.push_str(if *v { "true" } else { "false" }),28 Value::Number(n) => out.push_str(&format!("{}", n)),29 Value::String(s) => out.push_str(&format!("{:?}", s)),30 Value::Array(a) => {31 if a.is_empty() {32 out.push_str("[ ]");33 } else {34 let start_info = Info::new("start");35 let end_info = Info::new("end");36 let is_multiple_lines = move |ctx: &mut ConditionResolverContext| {37 condition_resolvers::is_multiple_lines(ctx, &start_info, &end_info)38 };39 out.push_str("[");40 out.push_info(start_info);41 out.push_signal(Signal::StartIndent);42 out.push_condition(conditions::if_true_or(43 "array start",44 is_multiple_lines.clone(),45 Signal::NewLine.into(),46 Signal::SpaceOrNewLine.into(),47 ));48 for item in a {49 write_nix_buf(item, out);50 out.push_condition(conditions::if_true_or(51 "element separator",52 is_multiple_lines.clone(),53 Signal::NewLine.into(),54 Signal::SpaceOrNewLine.into(),55 ));56 }57 out.push_signal(Signal::FinishIndent);58 out.push_info(end_info);59 out.push_str("]");60 }61 }62 Value::Object(obj) => {63 if obj.is_empty() {64 out.push_str("{ }")65 } else {66 let start_info = Info::new("start");67 let end_info = Info::new("end");68 let is_multiple_lines = move |ctx: &mut ConditionResolverContext| {69 condition_resolvers::is_multiple_lines(ctx, &start_info, &end_info)70 };71 out.push_str("{");72 out.push_info(start_info);73 out.push_signal(Signal::StartIndent);74 out.push_condition(conditions::if_true_or(75 "object start",76 is_multiple_lines.clone(),77 Signal::NewLine.into(),78 Signal::SpaceOrNewLine.into(),79 ));80 for (k, v) in obj {81 write_nix_obj_key_buf(k, v, out);82 out.push_condition(conditions::if_true_or(83 "element separator",84 is_multiple_lines.clone(),85 Signal::NewLine.into(),86 Signal::SpaceOrNewLine.into(),87 ));88 }89 out.push_signal(Signal::FinishIndent);90 out.push_info(end_info);91 out.push_str("}");92 }93 }94 };95}9697pub fn write_nix(value: &Value) -> String {98 format(99 || {100 let mut items = PrintItems::new();101 write_nix_buf(value, &mut items);102 items103 },104 PrintOptions {105 max_width: 120,106 use_tabs: false,107 indent_width: 2,108 new_line_text: "\n",109 },110 )111}