mod mapping;
mod modules;
mod output;
mod parser;
mod rule;
use super::prelude;
use crate::parsing::rule::impls::block::Arguments;
use crate::parsing::rule::{LineRequirement, Rule};
use crate::parsing::{ParseResult, Parser};
use crate::tree::Elements;
use std::fmt::{self, Debug};
pub use self::output::ModuleParseOutput;
pub use self::rule::BLOCK_MODULE;
#[derive(Clone)]
pub struct ModuleRule {
name: &'static str,
accepts_names: &'static [&'static str],
parse_fn: ModuleParseFn,
}
impl ModuleRule {
#[cold]
pub fn rule(&self) -> Rule {
fn try_consume_fn<'r, 't>(
_: &mut Parser<'r, 't>,
) -> ParseResult<'r, 't, Elements<'t>> {
panic!("Pseudo rule for this module should not be executed directly!");
}
Rule {
name: self.name,
position: LineRequirement::Any,
try_consume_fn,
}
}
}
impl Debug for ModuleRule {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
f.debug_struct("ModuleRule")
.field("name", &self.name)
.field("accepts_names", &self.accepts_names)
.field("parse_fn", &(self.parse_fn as *const ()))
.finish()
}
}
pub type ModuleParseFn = for<'r, 't> fn(
&mut Parser<'r, 't>,
&'t str,
Arguments<'t>,
) -> ParseResult<'r, 't, ModuleParseOutput<'t>>;