xshade-parser 0.1.2

Parser and untyped AST for the xshade language.
Documentation
use ::std::convert::From;
use ::std::error::Error;
use ::std::fmt;
use ::ast::Span;

pub type ParseResult<T> = Result<T, ParseError>;

#[derive(Debug, Copy, Clone, Serialize, Deserialize)]
pub enum ParseErrorKind {
    Unknown = 0,
    UnrecognizedCharacter = 1,
    InvalidTopLevelItem = 1000,
    InvalidStructName = 2000,
    InvalidFunctionName = 3000,
    MissingArgumentList = 3001,
    MissingOpenCurlyBraces = 5000,
    MissingClosingCurlyBraces = 5001,
    MissingError = 999999,
}

impl From<u32> for ParseErrorKind {
    fn from(value: u32) -> Self {
        match value {
            1 => ParseErrorKind::UnrecognizedCharacter,
            1000 => ParseErrorKind::InvalidTopLevelItem,
            2000 => ParseErrorKind::InvalidStructName,
            3000 => ParseErrorKind::InvalidFunctionName,
            3001 => ParseErrorKind::MissingArgumentList,
            5000 => ParseErrorKind::MissingOpenCurlyBraces,
            5001 => ParseErrorKind::MissingClosingCurlyBraces,
            999999 => ParseErrorKind::MissingError,

            _ => ParseErrorKind::Unknown,
        }
    }
}

#[derive(Debug, Serialize, Deserialize)]
pub struct ParseError {
    span: Span,
    kind: ParseErrorKind,
}

impl ParseError {
    pub fn new(span: Span, kind: ParseErrorKind) -> ParseError {
        ParseError {
            span,
            kind,
        }
    }
}

impl Error for ParseError {
    fn description(&self) -> &str {
        "ParseError"
    }

    fn cause(&self) -> Option<&Error> {
        None
    }
}

impl fmt::Display for ParseError {
    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
        match self.kind {
            ParseErrorKind::Unknown => write!(f, "ParseError: Unknown error at {}.", self.span),
            ParseErrorKind::UnrecognizedCharacter => write!(f, "ParseError: Unrecognized character at {}.", self.span),
            ParseErrorKind::InvalidTopLevelItem => write!(f, "ParseError: Invalid top level item at {}.", self.span),
            ParseErrorKind::MissingOpenCurlyBraces => write!(f, "ParseError: Missing opening curly braces at {}.", self.span),
            ParseErrorKind::MissingClosingCurlyBraces => write!(f, "ParseError: Missing closing curly braces at {}.", self.span),
            ParseErrorKind::InvalidStructName => write!(f, "ParseError: Invalid struct name at {}.", self.span),
            ParseErrorKind::InvalidFunctionName => write!(f, "ParseError: Invalid function name at {}.", self.span),
            ParseErrorKind::MissingArgumentList => write!(f, "ParseError: Missing argument list at {}.", self.span),
            ParseErrorKind::MissingError => write!(f, "ParseError: A custom error is missing in a nom parser."),
        }
    }
}