use super::Span;
use nom::{
branch::alt,
bytes::complete::{tag, take_while_m_n},
character::complete::line_ending,
combinator::recognize,
IResult, Parser,
};
pub fn soft_line_break(input: Span) -> IResult<Span, ()> {
log::debug!("Parsing soft line break");
let (input, _) = line_ending(input)?;
Ok((input, ()))
}
pub fn hard_line_break(input: Span) -> IResult<Span, ()> {
log::debug!("Parsing hard line break");
let (input, _) = alt((
recognize((
take_while_m_n(2, usize::MAX, |c: char| c == ' '),
line_ending,
)),
recognize((tag("\\"), line_ending)), ))
.parse(input)?;
Ok((input, ()))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn smoke_test_soft_line_break() {
let input = Span::new("\nmore text");
let result = soft_line_break(input);
assert!(result.is_ok());
let (rest, _) = result.unwrap();
assert_eq!(*rest.fragment(), "more text");
}
#[test]
fn smoke_test_hard_line_break_spaces() {
let input = Span::new(" \nmore text");
let result = hard_line_break(input);
assert!(result.is_ok());
let (rest, _) = result.unwrap();
assert_eq!(*rest.fragment(), "more text");
}
#[test]
fn smoke_test_hard_line_break_backslash() {
let input = Span::new("\\\nmore text");
let result = hard_line_break(input);
assert!(result.is_ok());
let (rest, _) = result.unwrap();
assert_eq!(*rest.fragment(), "more text");
}
#[test]
fn smoke_test_hard_line_break_exact_two_spaces() {
let input = Span::new(" \nmore text");
let result = hard_line_break(input);
assert!(result.is_ok());
}
#[test]
fn smoke_test_hard_line_break_one_space_fails() {
let input = Span::new(" \nmore text");
let result = hard_line_break(input);
assert!(result.is_err()); }
#[test]
fn smoke_test_hard_line_break_three_spaces() {
let input = Span::new(" \nmore text");
let result = hard_line_break(input);
assert!(result.is_ok());
let (rest, _) = result.unwrap();
assert_eq!(*rest.fragment(), "more text"); }
#[test]
fn smoke_test_soft_line_break_unix() {
let input = Span::new("\ntext");
let result = soft_line_break(input);
assert!(result.is_ok());
}
#[test]
fn smoke_test_soft_line_break_windows() {
let input = Span::new("\r\ntext");
let result = soft_line_break(input);
assert!(result.is_ok());
}
}