use super::prelude::*;
use crate::parsing::Parser;
use std::fmt::{self, Debug};
mod mapping;
pub mod impls;
pub use self::mapping::{get_rules_for_token, RULE_MAP};
#[derive(Copy, Clone)]
pub struct Rule {
name: &'static str,
try_consume_fn: TryConsumeFn,
}
impl Rule {
#[inline]
pub fn name(self) -> &'static str {
self.name
}
#[inline]
pub fn try_consume<'p, 'r, 't>(
self,
log: &slog::Logger,
parser: &'p mut Parser<'r, 't>,
) -> ParseResult<'r, 't, Elements<'t>> {
info!(log, "Trying to consume for parse rule"; "name" => self.name);
let mut sub_parser = parser.clone_with_rule(self);
let result = (self.try_consume_fn)(log, &mut sub_parser);
if result.is_ok() {
parser.update(&sub_parser);
}
result
}
}
impl Debug for Rule {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("Rule")
.field("name", &self.name)
.field("try_consume_fn", &(self.try_consume_fn as *const ()))
.finish()
}
}
impl slog::Value for Rule {
fn serialize(
&self,
_: &slog::Record,
key: slog::Key,
serializer: &mut dyn slog::Serializer,
) -> slog::Result {
serializer.emit_str(key, self.name())
}
}
pub type TryConsumeFn = for<'p, 'r, 't> fn(
log: &slog::Logger,
parser: &'p mut Parser<'r, 't>,
) -> ParseResult<'r, 't, Elements<'t>>;