mod blocks;
mod inline;
mod link_util;
mod util;

use nom::{
    Parser,
    branch::alt,
    character::complete::{line_ending, space1},
    combinator::eof,
    multi::many0,
    sequence::terminated,
};

use crate::ast::Document;

/// Parse the given Markdown string into an AST.
pub fn parse_markdown(input: &str) -> Result<Document, nom::Err<nom::error::Error<&str>>> {
    let empty_lines = many0(alt((space1, line_ending)));
    let mut parser = terminated(many0(crate::parser::blocks::block()), (empty_lines, eof));
    let (_, blocks) = parser.parse(input)?;

    let blocks = blocks.into_iter().flatten().collect();

    Ok(Document { blocks })
}
