From b6876f9df6e3119331fac01c0bc954ca9f3c798b Mon Sep 17 00:00:00 2001 From: 魏曹先生 <1992414357@qq.com> Date: Sun, 5 Apr 2026 20:33:57 +0800 Subject: Add general renderer support with serialization formats --- mingling_core/src/renderer/general.rs | 96 +++++++++++++++++++++++++++++ mingling_core/src/renderer/general/error.rs | 30 +++++++++ 2 files changed, 126 insertions(+) create mode 100644 mingling_core/src/renderer/general.rs create mode 100644 mingling_core/src/renderer/general/error.rs (limited to 'mingling_core/src/renderer') diff --git a/mingling_core/src/renderer/general.rs b/mingling_core/src/renderer/general.rs new file mode 100644 index 0000000..83ea911 --- /dev/null +++ b/mingling_core/src/renderer/general.rs @@ -0,0 +1,96 @@ +use crate::{ + GeneralRendererSetting, RenderResult, renderer::general::error::GeneralRendererSerializeError, +}; +use serde::Serialize; + +pub mod error; +pub struct GeneralRenderer; + +impl GeneralRenderer { + // Renders data in the specified format to the given RenderResult. + pub fn render( + data: &T, + setting: &GeneralRendererSetting, + r: &mut RenderResult, + ) -> Result<(), GeneralRendererSerializeError> { + match setting { + GeneralRendererSetting::Disable => Ok(()), + GeneralRendererSetting::Json => Self::render_to_json(data, r), + GeneralRendererSetting::JsonPretty => Self::render_to_json_pretty(data, r), + GeneralRendererSetting::Yaml => Self::render_to_yaml(data, r), + GeneralRendererSetting::Toml => Self::render_to_toml(data, r), + GeneralRendererSetting::Ron => Self::render_to_ron(data, r), + GeneralRendererSetting::RonPretty => Self::render_to_ron_pretty(data, r), + } + } + + /// Serializes data to JSON format and writes it to the render result. + pub fn render_to_json( + data: &T, + r: &mut RenderResult, + ) -> Result<(), GeneralRendererSerializeError> { + let json_string = serde_json::to_string(data) + .map_err(|e| GeneralRendererSerializeError::new(e.to_string()))?; + r.print(format!("{}", json_string).as_str()); + Ok(()) + } + + /// Serializes data to pretty-printed JSON format and writes it to the render result. + pub fn render_to_json_pretty( + data: &T, + r: &mut RenderResult, + ) -> Result<(), GeneralRendererSerializeError> { + let json_string = serde_json::to_string_pretty(data) + .map_err(|e| GeneralRendererSerializeError::new(e.to_string()))?; + r.print(format!("{}", json_string).as_str()); + Ok(()) + } + + /// Serializes data to RON format and writes it to the render result. + pub fn render_to_ron( + data: &T, + r: &mut RenderResult, + ) -> Result<(), GeneralRendererSerializeError> { + let ron_string = ron::ser::to_string(data) + .map_err(|e| GeneralRendererSerializeError::new(e.to_string()))?; + r.print(format!("{}", ron_string).as_str()); + Ok(()) + } + + /// Serializes data to pretty-printed RON format and writes it to the render result. + pub fn render_to_ron_pretty( + data: &T, + r: &mut RenderResult, + ) -> Result<(), GeneralRendererSerializeError> { + let mut pretty_config = ron::ser::PrettyConfig::new(); + pretty_config.new_line = std::borrow::Cow::from("\n"); + pretty_config.indentor = std::borrow::Cow::from(" "); + + let ron_string = ron::ser::to_string_pretty(data, pretty_config) + .map_err(|e| GeneralRendererSerializeError::new(e.to_string()))?; + r.print(format!("{}", ron_string).as_str()); + Ok(()) + } + + /// Serializes data to TOML format and writes it to the render result. + pub fn render_to_toml( + data: &T, + r: &mut RenderResult, + ) -> Result<(), GeneralRendererSerializeError> { + let toml_string = + toml::to_string(data).map_err(|e| GeneralRendererSerializeError::new(e.to_string()))?; + r.print(format!("{}", toml_string).as_str()); + Ok(()) + } + + /// Serializes data to YAML format and writes it to the render result. + pub fn render_to_yaml( + data: &T, + r: &mut RenderResult, + ) -> Result<(), GeneralRendererSerializeError> { + let yaml_string = serde_yaml::to_string(data) + .map_err(|e| GeneralRendererSerializeError::new(e.to_string()))?; + r.print(format!("{}", yaml_string).as_str()); + Ok(()) + } +} diff --git a/mingling_core/src/renderer/general/error.rs b/mingling_core/src/renderer/general/error.rs new file mode 100644 index 0000000..885b5bd --- /dev/null +++ b/mingling_core/src/renderer/general/error.rs @@ -0,0 +1,30 @@ +#[derive(Debug)] +pub struct GeneralRendererSerializeError { + error: String, +} + +impl GeneralRendererSerializeError { + pub fn new(error: String) -> Self { + Self { error } + } +} + +impl From<&str> for GeneralRendererSerializeError { + fn from(s: &str) -> Self { + Self::new(s.to_string()) + } +} + +impl std::ops::Deref for GeneralRendererSerializeError { + type Target = String; + + fn deref(&self) -> &Self::Target { + &self.error + } +} + +impl Into for GeneralRendererSerializeError { + fn into(self) -> String { + self.error + } +} -- cgit