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: {}",
31                    node_type
32                )
33            }
34            HtmlWriteError::InvalidStructure(msg) => {
35                write!(f, "Invalid structure for HTML conversion: {}", msg)
36            }
37            HtmlWriteError::InvalidHtmlTag(tag_name) => {
38                write!(f, "Invalid HTML tag name: {}", tag_name)
39            }
40            HtmlWriteError::InvalidHtmlAttribute(attr_name) => {
41                write!(f, "Invalid HTML attribute name: {}", attr_name)
42            }
43            HtmlWriteError::CustomNodeError(msg) => {
44                write!(f, "Error writing custom node: {}", msg)
45            }
46        }
47    }
48}
49
50impl std::error::Error for HtmlWriteError {
51    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
52        match self {
53            HtmlWriteError::Io(err) => Some(err),
54            _ => None,
55        }
56    }
57}
58
59impl HtmlWriteError {
60    /// 将 HtmlWriteError 转换为 WriteError
61    pub fn into_write_error(self) -> WriteError {
62        match self {
63            HtmlWriteError::Io(err) => WriteError::IoError(err),
64            HtmlWriteError::UnsupportedNodeType(msg) => WriteError::Custom {
65                message: format!("HTML writer error: {}", msg),
66                code: None,
67            },
68            HtmlWriteError::InvalidStructure(msg) => WriteError::InvalidStructure(msg),
69            HtmlWriteError::InvalidHtmlTag(tag) => WriteError::InvalidHtmlTag(tag),
70            HtmlWriteError::InvalidHtmlAttribute(attr) => WriteError::InvalidHtmlAttribute(attr),
71            HtmlWriteError::CustomNodeError(msg) => WriteError::Custom {
72                message: format!("Custom node error: {}", msg),
73                code: None,
74            },
75        }
76    }
77}
78
79// Allow converting io::Error into HtmlWriteError for convenience when using `?`
80impl From<io::Error> for HtmlWriteError {
81    fn from(err: io::Error) -> Self {
82        HtmlWriteError::Io(err)
83    }
84}
85
86/// Result type alias for HTML writer operations from AST.
87pub type HtmlWriteResult<T> = Result<T, HtmlWriteError>;