magical markdown slides
1use std::io;
2use thiserror::Error;
3
4/// Errors that can occur during slide parsing and rendering
5#[derive(Error, Debug)]
6pub enum SlideError {
7 #[error("Failed to read file: {0}")]
8 IoError(#[from] io::Error),
9
10 #[error("Failed to parse markdown at line {line}: {message}")]
11 ParseError { line: usize, message: String },
12
13 #[error("Invalid slide format: {0}")]
14 InvalidFormat(String),
15
16 #[error("Front matter error: {0}")]
17 FrontMatterError(String),
18
19 #[error("YAML parsing failed: {0}")]
20 YamlError(#[from] serde_yml::Error),
21
22 #[error("JSON parsing failed: {0}")]
23 JsonError(#[from] serde_json::Error),
24}
25
26pub type Result<T> = std::result::Result<T, SlideError>;
27
28impl SlideError {
29 pub fn parse_error(line: usize, message: impl Into<String>) -> Self {
30 Self::ParseError {
31 line,
32 message: message.into(),
33 }
34 }
35
36 pub fn invalid_format(message: impl Into<String>) -> Self {
37 Self::InvalidFormat(message.into())
38 }
39
40 pub fn front_matter(message: impl Into<String>) -> Self {
41 Self::FrontMatterError(message.into())
42 }
43}
44
45#[cfg(test)]
46mod tests {
47 use super::*;
48
49 #[test]
50 fn error_creation() {
51 let err = SlideError::parse_error(10, "Invalid syntax");
52 assert!(err.to_string().contains("line 10"));
53 assert!(err.to_string().contains("Invalid syntax"));
54 }
55
56 #[test]
57 fn error_conversion() {
58 let io_err = io::Error::new(io::ErrorKind::NotFound, "file not found");
59 let slide_err: SlideError = io_err.into();
60 assert!(slide_err.to_string().contains("Failed to read file"));
61 }
62}