use combine::*;
use combine::char::{char, crlf, newline as lf};
use combine::range::{recognize, take_while, take_while1};
use combine::primitives::RangeStream;
#[inline]
fn is_wschar(c: char) -> bool {
match c {
' ' | '\t' => true,
_ => false,
}
}
parse!(ws() -> &'a str, {
take_while(is_wschar)
});
#[inline]
fn is_non_eol(c: char) -> bool {
match c {
'\u{09}' | '\u{20}'...'\u{10FFFF}' => true,
_ => false,
}
}
const COMMENT_START_SYMBOL: char = '#';
parse!(comment() -> &'a str, {
recognize((
try(char(COMMENT_START_SYMBOL)),
take_while(is_non_eol),
))
});
parse!(newline() -> char, {
choice((lf(), crlf()))
.map(|_| '\n')
.expected("a newline")
});
parse!(ws_newline() -> &'a str, {
recognize(
skip_many(choice((
newline().map(|_| "\n"),
take_while1(is_wschar),
))),
)
});
parse!(ws_newlines() -> &'a str, {
recognize((
newline(),
ws_newline(),
))
});
parse!(ws_comment_newline() -> &'a str, {
recognize(
skip_many(
choice((
skip_many1(
choice((
take_while1(is_wschar),
newline().map(|_| "\n"),
))
),
comment().map(|_| ()),
))
)
)
});
parse!(line_ending() -> &'a str, {
choice((
newline().map(|_| "\n"),
eof().map(|_| "")
))
});
parse!(line_trailing() -> &'a str, {
recognize((
ws(),
optional(comment()),
)).skip(line_ending())
});