use super::prelude::*;
use std::num::NonZeroU32;
pub const BLOCK_LINES: BlockRule = BlockRule {
name: "block-lines",
accepts_names: &["lines", "newlines"],
accepts_special: false,
accepts_newlines: true,
parse_fn,
};
fn parse_fn<'r, 't>(
log: &slog::Logger,
parser: &mut Parser<'r, 't>,
name: &'t str,
special: bool,
in_head: bool,
) -> ParseResult<'r, 't, Elements<'t>> {
debug!(log, "Parsing newlines block"; "in-head" => in_head);
assert_eq!(special, false, "Code doesn't allow special variant");
assert_block_name(&BLOCK_LINES, name);
let count = parser.get_head_value(&BLOCK_LINES, in_head, parse_count)?;
ok!(Element::LineBreaks(count))
}
fn parse_count<'r, 't>(
parser: &Parser<'r, 't>,
argument: Option<&'t str>,
) -> Result<NonZeroU32, ParseWarning> {
let argument = match argument {
Some(arg) => arg.trim(),
None => return Err(parser.make_warn(ParseWarningKind::BlockMissingArguments)),
};
argument.parse().map_err(|error| {
debug!(&parser.log(), "Invalid numeric expression: {}", error);
parser.make_warn(ParseWarningKind::BlockMalformedArguments)
})
}