1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
mod multiline_block;
mod singleline_block;

use crate::Result;
use multiline_block::multiline_block;
pub use multiline_block::{ListIndex, ListItem, MultilineBlock};
use singleline_block::singleline_block;
pub use singleline_block::{HeadingLevel, SinglelineBlock};

#[derive(Debug, PartialEq)]
pub enum Block {
  Singleline(SinglelineBlock),
  Multiline(MultilineBlock),
}

pub fn block_list(mut input: &str) -> Vec<Block> {
  let mut block_list = vec![];

  while let Ok((next_input, block)) = block(input) {
    block_list.push(block);
    if next_input.is_empty() {
      break;
    }
    input = next_input;
  }

  block_list
}

fn block(input: &str) -> Result<Block> {
  if let Ok((input, block)) = singleline_block(input) {
    Ok((input, Block::Singleline(block)))
  } else {
    let (input, block) = multiline_block(input)?;

    Ok((input, Block::Multiline(block)))
  }
}

pub(crate) fn multiline_block_list(input: &str) -> Vec<MultilineBlock> {
  let mut input = input;
  let mut block_list = vec![];

  while let Ok((next_input, block)) = multiline_block(input) {
    block_list.push(block);
    if next_input.is_empty() {
      break;
    }
    input = next_input;
  }

  block_list
}