use crate::parser::{
state::ParserState,
util::{
discard_error::discard_errors, erase::erase, first_successful::first_sucessful,
map::map_node_type, BoxedParserFn, NodeParserOption, NodeParserResult,
},
};
use self::{
boolean::BooleanLiteral,
integer::IntegerLiteral,
};
pub mod boolean;
pub mod integer;
pub mod string;
pub mod character;
pub(self) mod escapes;
#[derive(Debug)]
pub enum Literal<'src> {
Integer(IntegerLiteral<'src>),
Boolean(BooleanLiteral<'src>),
}
fn convert_to_literal_parser<'src, PF, LC, N>(
parser_function: PF,
literal_conversion: LC,
) -> BoxedParserFn<'src, NodeParserOption<Literal<'src>>>
where
PF: (Fn(&mut ParserState<'src>) -> NodeParserResult<N>) + 'src,
LC: (Fn(N) -> Literal<'src>) + 'src,
{
erase(discard_errors(map_node_type(parser_function, literal_conversion)))
}
impl<'src> Literal<'src> {
pub fn parse(parser_state: &mut ParserState<'src>) -> NodeParserOption<Self> {
let parser = first_sucessful(vec![
convert_to_literal_parser(IntegerLiteral::parse, Literal::Integer),
convert_to_literal_parser(BooleanLiteral::parse, Literal::Boolean),
]);
(parser)(parser_state)
}
}