pdf-doc 0.1.2

Create a writing document and save to PDF with Rust.
use serde::{Deserialize, Serialize};
use serde_json;
use std::fmt::Display;
use std::fmt::{self, Formatter};
use std::io;

#[derive(Debug)]
pub enum DocError {
    SerializationError(serde_json::Error),
    FileError(io::Error),
    FontLoadError(google_fonts::FontError),
    FontParseError(StringError),
}

impl std::error::Error for DocError {}

impl Display for DocError {
    fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
        match self {
            DocError::SerializationError(err) => write!(f, "Serialization error: {}", err),
            DocError::FileError(err) => write!(f, "File error: {}", err),
            DocError::FontLoadError(err) => write!(f, "Font load error: {}", err),
            DocError::FontParseError(err) => write!(f, "Font parse error: {}", err),
        }
    }
}

impl From<serde_json::Error> for DocError {
    fn from(err: serde_json::Error) -> DocError {
        DocError::SerializationError(err)
    }
}

impl From<io::Error> for DocError {
    fn from(err: io::Error) -> DocError {
        DocError::FileError(err)
    }
}

impl From<google_fonts::FontError> for DocError {
    fn from(err: google_fonts::FontError) -> DocError {
        DocError::FontLoadError(err)
    }
}

impl From<&str> for DocError {
    fn from(msg: &str) -> DocError {
        DocError::FontParseError(StringError::new(msg))
    }
}

#[derive(Debug, Serialize, Deserialize, Clone)]
pub struct StringError {
    msg: String,
}
impl StringError {
    pub fn new(msg: &str) -> Self {
        Self {
            msg: msg.to_string(),
        }
    }
}
impl Display for StringError {
    fn fmt(&self, f: &mut Formatter) -> fmt::Result {
        write!(f, "{}", self.msg)
    }
}
impl std::error::Error for StringError {}

impl From<&str> for StringError {
    fn from(msg: &str) -> StringError {
        StringError::new(msg)
    }
}