Skip to main content

batuta/oracle/svg/renderers/
mod.rs

1//! SVG Renderers
2//!
3//! Specialized renderers for different diagram types.
4
5pub mod shape_heavy;
6pub mod text_heavy;
7
8pub use shape_heavy::ShapeHeavyRenderer;
9pub use text_heavy::TextHeavyRenderer;
10
11/// Render mode for SVG generation
12#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
13pub enum RenderMode {
14    /// Shape-heavy: architectural diagrams, component diagrams
15    #[default]
16    ShapeHeavy,
17    /// Text-heavy: documentation diagrams, flowcharts with labels
18    TextHeavy,
19}
20
21impl std::fmt::Display for RenderMode {
22    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
23        match self {
24            Self::ShapeHeavy => write!(f, "shape-heavy"),
25            Self::TextHeavy => write!(f, "text-heavy"),
26        }
27    }
28}
29
30impl std::str::FromStr for RenderMode {
31    type Err = String;
32
33    fn from_str(s: &str) -> Result<Self, Self::Err> {
34        match s.to_lowercase().as_str() {
35            "shape-heavy" | "shape_heavy" | "shapes" => Ok(Self::ShapeHeavy),
36            "text-heavy" | "text_heavy" | "text" => Ok(Self::TextHeavy),
37            _ => Err(format!("Unknown render mode: {}", s)),
38        }
39    }
40}
41
42#[cfg(test)]
43mod tests {
44    use super::*;
45
46    #[test]
47    fn test_render_mode_display() {
48        assert_eq!(format!("{}", RenderMode::ShapeHeavy), "shape-heavy");
49        assert_eq!(format!("{}", RenderMode::TextHeavy), "text-heavy");
50    }
51
52    #[test]
53    fn test_render_mode_from_str() {
54        assert_eq!(
55            "shape-heavy".parse::<RenderMode>().expect("parse failed"),
56            RenderMode::ShapeHeavy
57        );
58        assert_eq!(
59            "text-heavy".parse::<RenderMode>().expect("parse failed"),
60            RenderMode::TextHeavy
61        );
62        assert!("invalid".parse::<RenderMode>().is_err());
63    }
64}