Skip to main content

dendryform_html/
error.rs

1//! Render error types.
2
3use std::fmt;
4
5/// Errors that occur during HTML rendering.
6#[derive(Debug)]
7#[non_exhaustive]
8pub enum RenderError {
9    /// A formatting/writing error.
10    Fmt(fmt::Error),
11}
12
13impl fmt::Display for RenderError {
14    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
15        match self {
16            Self::Fmt(e) => write!(f, "render formatting error: {e}"),
17        }
18    }
19}
20
21impl std::error::Error for RenderError {
22    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
23        match self {
24            Self::Fmt(e) => Some(e),
25        }
26    }
27}
28
29impl From<fmt::Error> for RenderError {
30    fn from(e: fmt::Error) -> Self {
31        Self::Fmt(e)
32    }
33}
34
35#[cfg(test)]
36mod tests {
37    use super::*;
38
39    #[test]
40    fn test_render_error_display_fmt() {
41        let inner = fmt::Error;
42        let err = RenderError::Fmt(inner);
43        let msg = format!("{err}");
44        assert!(msg.contains("render formatting error"));
45    }
46
47    #[test]
48    fn test_render_error_debug() {
49        let err = RenderError::Fmt(fmt::Error);
50        let debug = format!("{err:?}");
51        assert!(debug.contains("Fmt"));
52    }
53
54    #[test]
55    fn test_render_error_source() {
56        let err = RenderError::Fmt(fmt::Error);
57        let source = std::error::Error::source(&err);
58        assert!(source.is_some());
59    }
60
61    #[test]
62    fn test_render_error_from_fmt_error() {
63        let inner = fmt::Error;
64        let err: RenderError = inner.into();
65        assert!(matches!(err, RenderError::Fmt(_)));
66    }
67}