This commit is contained in:
Jurn Wubben 2025-10-22 14:13:30 +02:00
parent 5fbd4e6074
commit 014a139e60

View file

@ -1,3 +1,56 @@
fn main() { use nom::{
println!("Hello, world!"); IResult, Parser,
branch::permutation,
bytes::take_until,
character::{char, complete::multispace1},
error::{FromExternalError, ParseError},
multi::{fold, many_m_n},
sequence::{delimited, preceded},
};
enum Fragment<'a> {
Literal(&'a str),
Header(&'a str),
}
fn main() {
let input = concat!(
"Hallo daar!\n",
"Hoe gaat het?\n",
"# Met mij gaat het goed\n",
"Met jou\n",
"## Ja ook goed\n",
"Echt?\n",
"### Wow (not matched because we only accept 1 or 2 '#')\n",
"#StartOfFileHeaderNoSpace <-- not matched because we require a space after '#'\n",
" ## Indented header\n"
);
let x = parse_string::<()>(input).unwrap();
println!("{:?}", x);
}
fn parse_string<'a, E>(input: &'a str) -> IResult<&'a str, String, E>
where
E: ParseError<&'a str> + FromExternalError<&'a str, std::num::ParseIntError>,
{
fold(0.., parse_header, String::new, |mut string, newstr| {
string.push_str(newstr);
string
})
.parse(input)
}
fn parse_fragment<'a, E>(input: &'a str) -> IResult<&'a str, StringFragment<'a>, E>
where
E: ParseError<&'a str> + FromExternalError<&'a str, std::num::ParseIntError>,
{
alt((map(parse_header, Fragment::Header)))
}
fn parse_header<'a, E: ParseError<&'a str>>(input: &'a str) -> IResult<&'a str, &'a str, E> {
preceded(
permutation((char('\n'), many_m_n(1, 2, char('#')))),
take_until("\n"),
)
.parse(input)
} }