use alloc::string::ToString;
use crate::{
diagrams::class_diagram::configuration::ClassDiagramConfiguration, errors::ConfigError,
shared::generic_configuration::GenericConfigurationBuilder, traits::ConfigurationBuilder,
};
#[derive(Default, Debug, Clone, PartialEq, Eq, Hash, PartialOrd, Ord)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ClassDiagramConfigurationBuilder {
generic: GenericConfigurationBuilder,
hide_empty_members_box: bool,
}
impl ClassDiagramConfigurationBuilder {
pub fn hide_empty_members_box(mut self, hide: bool) -> Self {
self.hide_empty_members_box = hide;
self
}
pub fn theme(mut self, theme: crate::shared::generic_configuration::Theme) -> Self {
self.generic = self.generic.theme(theme);
self
}
pub fn look(mut self, look: crate::shared::generic_configuration::Look) -> Self {
self.generic = self.generic.look(look);
self
}
}
impl TryFrom<ClassDiagramConfigurationBuilder> for ClassDiagramConfiguration {
type Error = ConfigError;
fn try_from(builder: ClassDiagramConfigurationBuilder) -> Result<Self, Self::Error> {
Ok(ClassDiagramConfiguration {
generic: builder.generic.try_into()?,
hide_empty_members_box: builder.hide_empty_members_box,
})
}
}
impl ConfigurationBuilder for ClassDiagramConfigurationBuilder {
type Configuration = ClassDiagramConfiguration;
type Error = ConfigError;
fn build(self) -> Result<Self::Configuration, Self::Error> {
self.try_into()
}
fn title<S: ToString>(mut self, title: S) -> Result<Self, Self::Error> {
self.generic = self.generic.title(title)?;
Ok(self)
}
fn direction(mut self, direction: crate::shared::generic_configuration::Direction) -> Self {
self.generic = self.generic.direction(direction);
self
}
fn renderer(mut self, renderer: crate::shared::generic_configuration::Renderer) -> Self {
self.generic = self.generic.renderer(renderer);
self
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::{
shared::generic_configuration::{Direction, Look, Renderer, Theme},
traits::Configuration,
};
#[test]
fn test_class_diagram_configuration_builder()
-> Result<(), alloc::boxed::Box<dyn core::error::Error>> {
let config = ClassDiagramConfigurationBuilder::default()
.title("My Class Diagram")?
.direction(Direction::LeftToRight)
.renderer(Renderer::Dagre)
.theme(Theme::Forest)
.look(Look::HandDrawn)
.hide_empty_members_box(true)
.build()?;
assert!(config.hide_empty_members_box);
assert_eq!(config.title(), Some("My Class Diagram"));
assert_eq!(config.direction(), Direction::LeftToRight);
assert_eq!(config.renderer(), Renderer::Dagre);
assert_eq!(config.theme(), Theme::Forest);
assert_eq!(config.look(), Look::HandDrawn);
Ok(())
}
}