use super::*;
macro_rules! esc_identity {
($esc:expr) => {{
use winnow::{ascii::*, combinator::*, prelude::*, token::*};
preceded('\\', $esc.take())
}};
($first:expr, $($more:expr),+) => {{
use winnow::{ascii::*, combinator::*, prelude::*, token::*};
preceded('\\', alt(($first, $($more),+)).take())
}};
}
pub(super) use esc_identity;
macro_rules! llp {
($pattern:expr) => {{
use winnow::{ascii::*, combinator::*, prelude::*, token::*};
repeat(
1..,
delimited(
($pattern, space1),
slice_till!(1.., not!(line_ending, eof)).verify(|s: &str| !s.trim().is_empty()),
alt((line_ending, eof)),
),
)
.fold(String::new, |mut acc, s| {
if !acc.is_empty() {
acc.push_str(LINE_ENDING);
}
acc.push_str(s);
acc
})
}};
}
pub(super) use llp;
macro_rules! slice_till {
($occur:expr, $body:expr, $term:expr) => {{
use winnow::{ascii::*, combinator::*, prelude::*, token::*};
repeat_till($occur, $body, $term).map(|((), _)| ()).take()
}};
($occur:expr, $body:expr) => {{
use winnow::{ascii::*, combinator::*, prelude::*, token::*};
repeat($occur, $body).map(|()| ()).take()
}};
}
pub(super) use slice_till;
macro_rules! not {
($parser:expr) => {
preceded(not($parser), any.take())
};
($x:expr, $($y:expr),+) => {
not!(alt(($x.void(), $($y.void()),+)))
}
}
pub(super) use not;
macro_rules! enot {
($token:expr) => {
enot!($token, $token)
};
($parser:expr, $value:expr) => {
escaped(
not!($parser, "\\"),
'\\',
alt(($parser.value($value), "\\".value("\\"), empty.value("\\"))),
)
};
}
pub(super) use enot;
macro_rules! delimited_esc {
($delim:expr) => {
delimited_esc!($delim, $delim)
};
($left:expr, $right:expr) => {{
use winnow::{
ascii::*,
combinator::*,
error::{ParserError, StrContext},
prelude::*,
token::*,
};
use $crate::parser::functions::macros::*;
delimited(
$left,
enot!($right).verify(|x: &String| !x.trim().is_empty()),
$right,
)
}};
}
pub(super) use delimited_esc;