Skip to main content

ferrum_email_render/
lib.rs

1//! # ferrum-email-render
2//!
3//! The rendering engine for Ferrum Email.
4//!
5//! This crate takes `Component` implementations, calls their `render()` methods to
6//! produce `Node` trees, and converts those trees into:
7//!
8//! - **HTML** — email-safe HTML with all CSS inlined as `style=""` attributes
9//! - **Plain text** — extracted from text nodes with sensible formatting
10//!
11//! ## Rendering Pipeline
12//!
13//! ```text
14//! Component::render() → Node tree
15//!        ↓
16//!    CSS Inliner       (all styles → inline style="" attrs)
17//!        ↓
18//!    HTML Emitter      (produces final HTML string)
19//!        ↓
20//!    Text Extractor    (produces plain text fallback)
21//! ```
22//!
23//! ## Usage
24//!
25//! ```rust,no_run
26//! use ferrum_email_render::Renderer;
27//! use ferrum_email_core::Component;
28//! # struct MyEmail;
29//! # impl Component for MyEmail {
30//! #     fn render(&self) -> ferrum_email_core::Node { ferrum_email_core::Node::None }
31//! # }
32//!
33//! let renderer = Renderer::default();
34//! let email = MyEmail;
35//! let html = renderer.render_html(&email).unwrap();
36//! let text = renderer.render_text(&email).unwrap();
37//! ```
38
39pub mod css_inliner;
40pub mod html_emitter;
41pub mod renderer;
42pub mod text_extractor;
43
44pub use renderer::{RenderConfig, Renderer};
45
46/// Errors that can occur during rendering.
47#[derive(Debug)]
48pub enum RenderError {
49    /// A rendering operation failed.
50    RenderFailed(String),
51}
52
53impl std::fmt::Display for RenderError {
54    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
55        match self {
56            RenderError::RenderFailed(msg) => write!(f, "render error: {msg}"),
57        }
58    }
59}
60
61impl std::error::Error for RenderError {}