#![warn(missing_docs)]
use crate::ast;
use std::result;
pub(crate) mod atom;
pub(crate) mod expression;
use std::str::Chars;
#[derive(PartialEq, Clone, Debug)]
pub(crate) struct Possition {
pub(crate) n: usize,
pub(crate) row: usize,
pub(crate) col: usize,
pub(crate) start_line: usize,
}
impl Possition {
fn init() -> Self {
Self {
n: 0,
row: 0,
col: 0,
start_line: 0,
}
}
}
#[derive(Clone, Copy, Debug, PartialEq, PartialOrd, Eq, Ord)]
pub(crate) enum ErrPriority {
Normal,
Critical,
}
#[derive(Debug, Clone)]
pub struct Error {
pub(crate) pos: Possition,
pub(crate) descr: String,
pub(crate) line_before: String,
pub(crate) line_after: String,
pub(crate) parsing_rules: Vec<String>,
pub(crate) priority: ErrPriority,
}
#[derive(Debug, Clone)]
pub(crate) struct Status<'a> {
pub(crate) text2parse: &'a str,
pub(crate) it_parsing: Chars<'a>,
pub(crate) pos: Possition,
pub(crate) rules: &'a expression::SetOfRules,
pub(crate) potential_error: Option<Error>,
pub(crate) trace_rules: bool,
pub(crate) walking_rules: Vec<String>,
}
impl<'a> Status<'a> {
pub(crate) fn init(t2p: &'a str, rules: &'a expression::SetOfRules) -> Self {
Status {
text2parse: t2p,
it_parsing: t2p.chars(),
pos: Possition::init(),
trace_rules: false,
walking_rules: vec![],
rules,
potential_error: None,
}
}
pub(crate) fn init_debug(
t2p: &'a str,
rules: &'a expression::SetOfRules,
trace_rules: bool,
) -> Self {
Status {
text2parse: t2p,
it_parsing: t2p.chars(),
pos: Possition::init(),
trace_rules,
walking_rules: vec![],
rules,
potential_error: None,
}
}
pub(crate) fn push_rule(mut self, on_node: &str) -> Self {
self.walking_rules.push(on_node.to_string());
self
}
pub(crate) fn set_potential_error(mut self, err: Error) -> Self {
self.potential_error = Some(err);
self
}
}
pub(crate) type Result<'a> = result::Result<(Status<'a>, ast::Node), Error>;
#[cfg(test)]
mod test;
impl Error {
pub(crate) fn from_status(status: &Status, descr: &str, prior: ErrPriority) -> Self {
Error {
pos: status.pos.clone(),
descr: descr.to_owned(),
line_before: status.text2parse[status.pos.start_line..status.pos.n].to_string(),
line_after: status
.it_parsing
.clone()
.take_while(|&ch| ch != '\n' && ch != '\r')
.collect(),
parsing_rules: status.walking_rules.clone(),
priority: prior,
}
}
pub(crate) fn from_status_normal(status: &Status, descr: &str) -> Self {
Self::from_status(status, descr, ErrPriority::Normal)
}
}