magical markdown slides
at 9f8b184e4eefac55aaae12c0697e8ee9e6e1eebf 62 lines 1.6 kB view raw
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}