use super::{rule::Rule, ExtractedToken, Token};
use std::borrow::Cow;
use std::ops::Range;
use strum_macros::IntoStaticStr;
#[derive(Debug, Clone, PartialEq)]
pub enum ParseException<'t> {
Warning(ParseWarning),
Style(Cow<'t, str>),
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "kebab-case")]
pub struct ParseWarning {
token: Token,
rule: Cow<'static, str>,
span: Range<usize>,
kind: ParseWarningKind,
}
impl ParseWarning {
#[inline]
pub fn new(kind: ParseWarningKind, rule: Rule, current: &ExtractedToken) -> Self {
let token = current.token;
let span = Range::clone(¤t.span);
let rule = cow!(rule.name());
ParseWarning {
token,
rule,
span,
kind,
}
}
#[inline]
pub fn token(&self) -> Token {
self.token
}
#[inline]
pub fn rule(&self) -> &str {
&self.rule
}
#[inline]
pub fn span(&self) -> Range<usize> {
Range::clone(&self.span)
}
#[inline]
pub fn kind(&self) -> ParseWarningKind {
self.kind
}
}
#[derive(Serialize, Deserialize, IntoStaticStr, Debug, Copy, Clone, PartialEq, Eq)]
#[serde(rename_all = "kebab-case")]
pub enum ParseWarningKind {
RecursionDepthExceeded,
EndOfInput,
NotImplemented,
NoRulesMatch,
RuleFailed,
InvalidInclude,
ListDepthExceeded,
BlockquoteDepthExceeded,
NoSuchBlock,
InvalidSpecialBlock,
BlockMissingName,
BlockMissingCloseBrackets,
BlockMalformedArguments,
BlockMissingArguments,
BlockExpectedEnd,
BlockEndMismatch,
NoSuchModule,
ModuleMissingName,
InvalidUrl,
}
impl ParseWarningKind {
#[inline]
pub fn name(self) -> &'static str {
self.into()
}
}
impl slog::Value for ParseWarningKind {
fn serialize(
&self,
_: &slog::Record,
key: slog::Key,
serializer: &mut dyn slog::Serializer,
) -> slog::Result {
serializer.emit_str(key, self.name())
}
}