From 0aca85b294da363ca95b622eb409f6a505fb69e8 Mon Sep 17 00:00:00 2001 From: Ed Page Date: Mon, 5 Feb 2024 10:34:34 -0600 Subject: [PATCH] refactor(encode): Remove trait abstraction --- crates/toml_edit/src/array.rs | 2 +- crates/toml_edit/src/encode.rs | 348 ++++++++++++--------------- crates/toml_edit/src/inline_table.rs | 2 +- crates/toml_edit/src/key.rs | 2 +- crates/toml_edit/src/repr.rs | 2 +- crates/toml_edit/src/table.rs | 5 +- crates/toml_edit/src/value.rs | 2 +- 7 files changed, 167 insertions(+), 196 deletions(-) diff --git a/crates/toml_edit/src/array.rs b/crates/toml_edit/src/array.rs index 69e7f3cc..377f6765 100644 --- a/crates/toml_edit/src/array.rs +++ b/crates/toml_edit/src/array.rs @@ -392,7 +392,7 @@ impl Array { #[cfg(feature = "display")] impl std::fmt::Display for Array { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - crate::encode::Encode::encode(self, f, None, ("", "")) + crate::encode::encode_array(self, f, None, ("", "")) } } diff --git a/crates/toml_edit/src/encode.rs b/crates/toml_edit/src/encode.rs index db10e29e..1339d1c4 100644 --- a/crates/toml_edit/src/encode.rs +++ b/crates/toml_edit/src/encode.rs @@ -13,218 +13,190 @@ use crate::value::{ }; use crate::{Array, InlineTable, Item, Table, Value}; -pub(crate) trait Encode { - fn encode( - &self, - buf: &mut dyn Write, - input: Option<&str>, - default_decor: (&str, &str), - ) -> Result; +pub(crate) fn encode_key( + this: &Key, + buf: &mut dyn Write, + input: Option<&str>, + default_decor: (&str, &str), +) -> Result { + let decor = this.decor(); + decor.prefix_encode(buf, input, default_decor.0)?; + + if let Some(input) = input { + let repr = this + .as_repr() + .map(Cow::Borrowed) + .unwrap_or_else(|| Cow::Owned(this.default_repr())); + repr.encode(buf, input)?; + } else { + let repr = this.display_repr(); + write!(buf, "{}", repr)?; + }; + + decor.suffix_encode(buf, input, default_decor.1)?; + Ok(()) } -impl Encode for Key { - fn encode( - &self, - buf: &mut dyn Write, - input: Option<&str>, - default_decor: (&str, &str), - ) -> Result { - let decor = self.decor(); - decor.prefix_encode(buf, input, default_decor.0)?; - - if let Some(input) = input { - let repr = self - .as_repr() - .map(Cow::Borrowed) - .unwrap_or_else(|| Cow::Owned(self.default_repr())); - repr.encode(buf, input)?; +fn encode_key_path( + this: &[Key], + buf: &mut dyn Write, + input: Option<&str>, + default_decor: (&str, &str), +) -> Result { + for (i, key) in this.iter().enumerate() { + let first = i == 0; + let last = i + 1 == this.len(); + + let prefix = if first { + default_decor.0 } else { - let repr = self.display_repr(); - write!(buf, "{}", repr)?; + DEFAULT_KEY_PATH_DECOR.0 + }; + let suffix = if last { + default_decor.1 + } else { + DEFAULT_KEY_PATH_DECOR.1 }; - decor.suffix_encode(buf, input, default_decor.1)?; - Ok(()) - } -} - -impl<'k> Encode for &'k [Key] { - fn encode( - &self, - buf: &mut dyn Write, - input: Option<&str>, - default_decor: (&str, &str), - ) -> Result { - for (i, key) in self.iter().enumerate() { - let first = i == 0; - let last = i + 1 == self.len(); - - let prefix = if first { - default_decor.0 - } else { - DEFAULT_KEY_PATH_DECOR.0 - }; - let suffix = if last { - default_decor.1 - } else { - DEFAULT_KEY_PATH_DECOR.1 - }; - - if !first { - write!(buf, ".")?; - } - key.encode(buf, input, (prefix, suffix))?; + if !first { + write!(buf, ".")?; } - Ok(()) + encode_key(key, buf, input, (prefix, suffix))?; } + Ok(()) } -impl<'k> Encode for &'k [&'k Key] { - fn encode( - &self, - buf: &mut dyn Write, - input: Option<&str>, - default_decor: (&str, &str), - ) -> Result { - for (i, key) in self.iter().enumerate() { - let first = i == 0; - let last = i + 1 == self.len(); - - let prefix = if first { - default_decor.0 - } else { - DEFAULT_KEY_PATH_DECOR.0 - }; - let suffix = if last { - default_decor.1 - } else { - DEFAULT_KEY_PATH_DECOR.1 - }; - - if !first { - write!(buf, ".")?; - } - key.encode(buf, input, (prefix, suffix))?; - } - Ok(()) - } -} +pub(crate) fn encode_key_path_ref( + this: &[&Key], + buf: &mut dyn Write, + input: Option<&str>, + default_decor: (&str, &str), +) -> Result { + for (i, key) in this.iter().enumerate() { + let first = i == 0; + let last = i + 1 == this.len(); -impl Encode for Formatted -where - T: ValueRepr, -{ - fn encode( - &self, - buf: &mut dyn Write, - input: Option<&str>, - default_decor: (&str, &str), - ) -> Result { - let decor = self.decor(); - decor.prefix_encode(buf, input, default_decor.0)?; - - if let Some(input) = input { - let repr = self - .as_repr() - .map(Cow::Borrowed) - .unwrap_or_else(|| Cow::Owned(self.default_repr())); - repr.encode(buf, input)?; + let prefix = if first { + default_decor.0 } else { - let repr = self.display_repr(); - write!(buf, "{}", repr)?; + DEFAULT_KEY_PATH_DECOR.0 + }; + let suffix = if last { + default_decor.1 + } else { + DEFAULT_KEY_PATH_DECOR.1 }; - decor.suffix_encode(buf, input, default_decor.1)?; - Ok(()) + if !first { + write!(buf, ".")?; + } + encode_key(key, buf, input, (prefix, suffix))?; } + Ok(()) } -impl Encode for Array { - fn encode( - &self, - buf: &mut dyn Write, - input: Option<&str>, - default_decor: (&str, &str), - ) -> Result { - let decor = self.decor(); - decor.prefix_encode(buf, input, default_decor.0)?; - write!(buf, "[")?; +pub(crate) fn encode_formatted( + this: &Formatted, + buf: &mut dyn Write, + input: Option<&str>, + default_decor: (&str, &str), +) -> Result { + let decor = this.decor(); + decor.prefix_encode(buf, input, default_decor.0)?; + + if let Some(input) = input { + let repr = this + .as_repr() + .map(Cow::Borrowed) + .unwrap_or_else(|| Cow::Owned(this.default_repr())); + repr.encode(buf, input)?; + } else { + let repr = this.display_repr(); + write!(buf, "{}", repr)?; + }; - for (i, elem) in self.iter().enumerate() { - let inner_decor; - if i == 0 { - inner_decor = DEFAULT_LEADING_VALUE_DECOR; - } else { - inner_decor = DEFAULT_VALUE_DECOR; - write!(buf, ",")?; - } - elem.encode(buf, input, inner_decor)?; - } - if self.trailing_comma() && !self.is_empty() { + decor.suffix_encode(buf, input, default_decor.1)?; + Ok(()) +} + +pub(crate) fn encode_array( + this: &Array, + buf: &mut dyn Write, + input: Option<&str>, + default_decor: (&str, &str), +) -> Result { + let decor = this.decor(); + decor.prefix_encode(buf, input, default_decor.0)?; + write!(buf, "[")?; + + for (i, elem) in this.iter().enumerate() { + let inner_decor; + if i == 0 { + inner_decor = DEFAULT_LEADING_VALUE_DECOR; + } else { + inner_decor = DEFAULT_VALUE_DECOR; write!(buf, ",")?; } + encode_value(elem, buf, input, inner_decor)?; + } + if this.trailing_comma() && !this.is_empty() { + write!(buf, ",")?; + } - self.trailing().encode_with_default(buf, input, "")?; - write!(buf, "]")?; - decor.suffix_encode(buf, input, default_decor.1)?; + this.trailing().encode_with_default(buf, input, "")?; + write!(buf, "]")?; + decor.suffix_encode(buf, input, default_decor.1)?; - Ok(()) - } + Ok(()) } -impl Encode for InlineTable { - fn encode( - &self, - buf: &mut dyn Write, - input: Option<&str>, - default_decor: (&str, &str), - ) -> Result { - let decor = self.decor(); - decor.prefix_encode(buf, input, default_decor.0)?; - write!(buf, "{{")?; - self.preamble().encode_with_default(buf, input, "")?; - - let children = self.get_values(); - let len = children.len(); - for (i, (key_path, value)) in children.into_iter().enumerate() { - if i != 0 { - write!(buf, ",")?; - } - let inner_decor = if i == len - 1 { - DEFAULT_TRAILING_VALUE_DECOR - } else { - DEFAULT_VALUE_DECOR - }; - key_path - .as_slice() - .encode(buf, input, DEFAULT_INLINE_KEY_DECOR)?; - write!(buf, "=")?; - value.encode(buf, input, inner_decor)?; +pub(crate) fn encode_table( + this: &InlineTable, + buf: &mut dyn Write, + input: Option<&str>, + default_decor: (&str, &str), +) -> Result { + let decor = this.decor(); + decor.prefix_encode(buf, input, default_decor.0)?; + write!(buf, "{{")?; + this.preamble().encode_with_default(buf, input, "")?; + + let children = this.get_values(); + let len = children.len(); + for (i, (key_path, value)) in children.into_iter().enumerate() { + if i != 0 { + write!(buf, ",")?; } + let inner_decor = if i == len - 1 { + DEFAULT_TRAILING_VALUE_DECOR + } else { + DEFAULT_VALUE_DECOR + }; + encode_key_path_ref(&key_path, buf, input, DEFAULT_INLINE_KEY_DECOR)?; + write!(buf, "=")?; + encode_value(value, buf, input, inner_decor)?; + } - write!(buf, "}}")?; - decor.suffix_encode(buf, input, default_decor.1)?; + write!(buf, "}}")?; + decor.suffix_encode(buf, input, default_decor.1)?; - Ok(()) - } + Ok(()) } -impl Encode for Value { - fn encode( - &self, - buf: &mut dyn Write, - input: Option<&str>, - default_decor: (&str, &str), - ) -> Result { - match self { - Value::String(repr) => repr.encode(buf, input, default_decor), - Value::Integer(repr) => repr.encode(buf, input, default_decor), - Value::Float(repr) => repr.encode(buf, input, default_decor), - Value::Boolean(repr) => repr.encode(buf, input, default_decor), - Value::Datetime(repr) => repr.encode(buf, input, default_decor), - Value::Array(array) => array.encode(buf, input, default_decor), - Value::InlineTable(table) => table.encode(buf, input, default_decor), - } +pub(crate) fn encode_value( + this: &Value, + buf: &mut dyn Write, + input: Option<&str>, + default_decor: (&str, &str), +) -> Result { + match this { + Value::String(repr) => encode_formatted(repr, buf, input, default_decor), + Value::Integer(repr) => encode_formatted(repr, buf, input, default_decor), + Value::Float(repr) => encode_formatted(repr, buf, input, default_decor), + Value::Boolean(repr) => encode_formatted(repr, buf, input, default_decor), + Value::Datetime(repr) => encode_formatted(repr, buf, input, default_decor), + Value::Array(array) => encode_array(array, buf, input, default_decor), + Value::InlineTable(table) => encode_table(table, buf, input, default_decor), } } @@ -332,7 +304,7 @@ fn visit_table( }; table.decor.prefix_encode(buf, input, default_decor.0)?; write!(buf, "[[")?; - path.encode(buf, input, DEFAULT_KEY_PATH_DECOR)?; + encode_key_path(path, buf, input, DEFAULT_KEY_PATH_DECOR)?; write!(buf, "]]")?; table.decor.suffix_encode(buf, input, default_decor.1)?; writeln!(buf)?; @@ -345,16 +317,16 @@ fn visit_table( }; table.decor.prefix_encode(buf, input, default_decor.0)?; write!(buf, "[")?; - path.encode(buf, input, DEFAULT_KEY_PATH_DECOR)?; + encode_key_path(path, buf, input, DEFAULT_KEY_PATH_DECOR)?; write!(buf, "]")?; table.decor.suffix_encode(buf, input, default_decor.1)?; writeln!(buf)?; } // print table body for (key_path, value) in children { - key_path.as_slice().encode(buf, input, DEFAULT_KEY_DECOR)?; + encode_key_path_ref(&key_path, buf, input, DEFAULT_KEY_DECOR)?; write!(buf, "=")?; - value.encode(buf, input, DEFAULT_VALUE_DECOR)?; + encode_value(value, buf, input, DEFAULT_VALUE_DECOR)?; writeln!(buf)?; } Ok(()) diff --git a/crates/toml_edit/src/inline_table.rs b/crates/toml_edit/src/inline_table.rs index 136c1e8f..ba1161c4 100644 --- a/crates/toml_edit/src/inline_table.rs +++ b/crates/toml_edit/src/inline_table.rs @@ -418,7 +418,7 @@ impl InlineTable { #[cfg(feature = "display")] impl std::fmt::Display for InlineTable { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - crate::encode::Encode::encode(self, f, None, ("", "")) + crate::encode::encode_table(self, f, None, ("", "")) } } diff --git a/crates/toml_edit/src/key.rs b/crates/toml_edit/src/key.rs index 2f99f708..27132edc 100644 --- a/crates/toml_edit/src/key.rs +++ b/crates/toml_edit/src/key.rs @@ -214,7 +214,7 @@ impl PartialEq for Key { #[cfg(feature = "display")] impl std::fmt::Display for Key { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - crate::encode::Encode::encode(self, f, None, ("", "")) + crate::encode::encode_key(self, f, None, ("", "")) } } diff --git a/crates/toml_edit/src/repr.rs b/crates/toml_edit/src/repr.rs index 7b408f4b..ad41bbfe 100644 --- a/crates/toml_edit/src/repr.rs +++ b/crates/toml_edit/src/repr.rs @@ -111,7 +111,7 @@ where T: ValueRepr, { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - crate::encode::Encode::encode(self, f, None, ("", "")) + crate::encode::encode_formatted(self, f, None, ("", "")) } } diff --git a/crates/toml_edit/src/table.rs b/crates/toml_edit/src/table.rs index 0f44a8e4..3a0d48c1 100644 --- a/crates/toml_edit/src/table.rs +++ b/crates/toml_edit/src/table.rs @@ -420,13 +420,12 @@ impl Table { #[cfg(feature = "display")] impl std::fmt::Display for Table { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - use crate::encode::Encode; let children = self.get_values(); // print table body for (key_path, value) in children { - key_path.as_slice().encode(f, None, DEFAULT_KEY_DECOR)?; + crate::encode::encode_key_path_ref(&key_path, f, None, DEFAULT_KEY_DECOR)?; write!(f, "=")?; - value.encode(f, None, DEFAULT_VALUE_DECOR)?; + crate::encode::encode_value(value, f, None, DEFAULT_VALUE_DECOR)?; writeln!(f)?; } Ok(()) diff --git a/crates/toml_edit/src/value.rs b/crates/toml_edit/src/value.rs index 1b397d90..f4164340 100644 --- a/crates/toml_edit/src/value.rs +++ b/crates/toml_edit/src/value.rs @@ -352,7 +352,7 @@ impl, V: Into> FromIterator<(K, V)> for Value { #[cfg(feature = "display")] impl std::fmt::Display for Value { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - crate::encode::Encode::encode(self, f, None, ("", "")) + crate::encode::encode_value(self, f, None, ("", "")) } }