pub mod standard;
pub mod latex;
pub mod mathml;
pub mod terminal;
pub use standard::StandardFormatter;
pub use latex::LaTeXFormatter;
pub use mathml::MathMLFormatter;
pub use terminal::TerminalFormatter;
use crate::core::Expression;
#[derive(Debug, Clone, PartialEq, serde::Serialize, serde::Deserialize)]
pub enum FormatType {
Standard,
Terminal,
LaTeX,
MathML,
}
#[derive(Debug, Clone)]
pub struct FormatOptions {
pub format_type: FormatType,
pub precision: Option<usize>,
pub use_parentheses: bool,
}
impl Default for FormatOptions {
fn default() -> Self {
Self {
format_type: FormatType::Standard,
precision: None,
use_parentheses: true,
}
}
}
pub trait Formatter: Send + Sync {
fn format(&self, expr: &Expression) -> String;
fn set_options(&mut self, options: FormatOptions);
}
pub struct FormatterFactory;
impl FormatterFactory {
pub fn create_formatter(format_type: FormatType) -> Box<dyn Formatter> {
match format_type {
FormatType::Standard => Box::new(StandardFormatter::new()),
FormatType::Terminal => Box::new(TerminalFormatter::new()),
FormatType::LaTeX => Box::new(LaTeXFormatter::new()),
FormatType::MathML => Box::new(MathMLFormatter::new()),
}
}
}
pub struct MultiFormatter {
current_formatter: Box<dyn Formatter>,
options: FormatOptions,
}
impl MultiFormatter {
pub fn new() -> Self {
let options = FormatOptions::default();
let formatter = FormatterFactory::create_formatter(options.format_type.clone());
Self {
current_formatter: formatter,
options,
}
}
pub fn with_format(format_type: FormatType) -> Self {
let mut options = FormatOptions::default();
options.format_type = format_type.clone();
let formatter = FormatterFactory::create_formatter(format_type);
Self {
current_formatter: formatter,
options,
}
}
pub fn set_format_type(&mut self, format_type: FormatType) {
if self.options.format_type != format_type {
self.options.format_type = format_type.clone();
self.current_formatter = FormatterFactory::create_formatter(format_type);
self.current_formatter.set_options(self.options.clone());
}
}
pub fn get_format_type(&self) -> &FormatType {
&self.options.format_type
}
}
impl Default for MultiFormatter {
fn default() -> Self {
Self::new()
}
}
impl Formatter for MultiFormatter {
fn format(&self, expr: &Expression) -> String {
self.current_formatter.format(expr)
}
fn set_options(&mut self, options: FormatOptions) {
if self.options.format_type != options.format_type {
self.current_formatter = FormatterFactory::create_formatter(options.format_type.clone());
}
self.options = options.clone();
self.current_formatter.set_options(options);
}
}