kladd 0.2.0

A weirdly personal markup language
Documentation
use std::{error::Error, fmt::Display};

use crate::{ast::NodeKind, lexer::TokenKind};

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum ParsingError {
    ParseError(&'static str),
    UnexpectedEnd,
    UnexpectedTokenKind(TokenKind, &'static str),
    UnexpectedToken(TokenKind, String, &'static str),
    InvalidAttribute(TokenKind),
    InvalidAttributeKind(TokenKind),
    MissingAttribute(&'static str, &'static str),
    InvalidHeading(String),
    MissingBlockEnd(String),
    MetadataDeserializationFailed(String),
}

impl Display for ParsingError {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            ParsingError::ParseError(e) => write!(f, "{}", e),
            ParsingError::UnexpectedToken(token, name, desc) => {
                write!(
                    f,
                    "found {:?} with body {} in {} unexpectedly",
                    token, name, desc
                )
            }
            ParsingError::InvalidAttribute(kind) => {
                write!(f, "{:?} is not a valid attribute", kind)
            }
            ParsingError::InvalidAttributeKind(kind) => {
                write!(f, "{:?} is not valid as an attribute key", kind)
            }
            ParsingError::MissingAttribute(attr, name) => {
                write!(f, "attribute {} required in {}", attr, name)
            }
            ParsingError::InvalidHeading(_) => todo!(),
            ParsingError::UnexpectedTokenKind(token_kind, desc) => {
                write!(
                    f,
                    "found token kind {:?} in {} unexpectedly",
                    token_kind, desc
                )
            }
            ParsingError::UnexpectedEnd => write!(f, "unexpectedly reached the end of input"),
            ParsingError::MissingBlockEnd(name) => {
                write!(f, "did not reach the end of {} block", name)
            }
            ParsingError::MetadataDeserializationFailed(inner) => {
                write!(
                    f,
                    "metadata deserialization failed with serde error: {}",
                    inner
                )
            }
        }
    }
}

impl Error for ParsingError {}

impl From<ParsingError> for KladdError {
    fn from(value: ParsingError) -> Self {
        KladdError::ParsingError(value)
    }
}

impl From<toml::de::Error> for ParsingError {
    fn from(value: toml::de::Error) -> Self {
        ParsingError::MetadataDeserializationFailed(value.to_string())
    }
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum HtmlRenderError {
    InvalidNode(NodeKind, &'static str),
}

impl From<HtmlRenderError> for KladdError {
    fn from(value: HtmlRenderError) -> Self {
        KladdError::HtmlRenderError(value)
    }
}

impl Display for HtmlRenderError {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            Self::InvalidNode(node, name) => {
                write!(f, "found unexpected node {:?} in {}", node, name)
            }
        }
    }
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum KladdError {
    ParsingError(ParsingError),
    HtmlRenderError(HtmlRenderError),
}

impl Display for KladdError {
    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
        match self {
            KladdError::ParsingError(e) => write!(f, "{}", e),
            KladdError::HtmlRenderError(e) => {
                write!(f, "{}", e)
            }
        }
    }
}

impl Error for KladdError {}