cmark_writer/writer/html/
error.rs

1use crate::error::WriteError;
2use std::fmt::{self, Display};
3use std::io;
4
5/// Errors that can occur during HTML writing from AST nodes.
6#[derive(Debug)]
7pub enum HtmlWriteError {
8    /// An underlying I/O error occurred.
9    Io(io::Error),
10    /// A node type is not supported for HTML conversion (or not yet implemented).
11    UnsupportedNodeType(String),
12    /// Invalid structure or content encountered during HTML conversion.
13    InvalidStructure(String),
14    /// An invalid HTML tag name was encountered.
15    InvalidHtmlTag(String),
16    /// An invalid HTML attribute name was encountered.
17    InvalidHtmlAttribute(String),
18    /// An error occurred while writing a custom node.
19    CustomNodeError(String),
20    // Add more specific HTML-related errors as needed
21}
22
23impl Display for HtmlWriteError {
24    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
25        match self {
26            HtmlWriteError::Io(err) => write!(f, "HTML I/O error: {err}"),
27            HtmlWriteError::UnsupportedNodeType(node_type) => {
28                write!(
29                    f,
30                    "HTML conversion not supported for node type: {node_type}"
31                )
32            }
33            HtmlWriteError::InvalidStructure(msg) => {
34                write!(f, "Invalid structure for HTML conversion: {msg}")
35            }
36            HtmlWriteError::InvalidHtmlTag(tag_name) => {
37                write!(f, "Invalid HTML tag name: {tag_name}")
38            }
39            HtmlWriteError::InvalidHtmlAttribute(attr_name) => {
40                write!(f, "Invalid HTML attribute name: {attr_name}")
41            }
42            HtmlWriteError::CustomNodeError(msg) => {
43                write!(f, "Error writing custom node: {msg}")
44            }
45        }
46    }
47}
48
49impl std::error::Error for HtmlWriteError {
50    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
51        match self {
52            HtmlWriteError::Io(err) => Some(err),
53            _ => None,
54        }
55    }
56}
57
58impl HtmlWriteError {
59    /// Converts an `HtmlWriteError` into a `WriteError`.
60    pub fn into_write_error(self) -> WriteError {
61        match self {
62            HtmlWriteError::Io(err) => WriteError::IoError(err),
63            HtmlWriteError::UnsupportedNodeType(msg) => WriteError::Custom {
64                message: format!("HTML writer error: {msg}").into(),
65                code: None,
66            },
67            HtmlWriteError::InvalidStructure(msg) => WriteError::InvalidStructure(msg.into()),
68            HtmlWriteError::InvalidHtmlTag(tag) => WriteError::InvalidHtmlTag(tag.into()),
69            HtmlWriteError::InvalidHtmlAttribute(attr) => {
70                WriteError::InvalidHtmlAttribute(attr.into())
71            }
72            HtmlWriteError::CustomNodeError(msg) => WriteError::Custom {
73                message: format!("Custom node error: {msg}").into(),
74                code: None,
75            },
76        }
77    }
78}
79
80// Allow converting io::Error into HtmlWriteError for convenience when using `?`
81impl From<io::Error> for HtmlWriteError {
82    fn from(err: io::Error) -> Self {
83        HtmlWriteError::Io(err)
84    }
85}
86
87/// Result type alias for HTML writer operations from AST.
88pub type HtmlWriteResult<T> = Result<T, HtmlWriteError>;