Skip to main content

sevenmark_parser/parser/
document.rs

1use crate::ast::Element;
2use crate::parser::ParserInput;
3use crate::parser::brace::brace_redirect_parser;
4use crate::parser::element::element_parser;
5use winnow::Result;
6use winnow::combinator::repeat;
7use winnow::prelude::*;
8
9/// 문서 파서 - element들을 반복 파싱 (기존 many0 + alt 패턴)
10/// redirect가 문서 시작에 있으면 그것만 반환하고 파싱 중단
11pub fn document_parser(parser_input: &mut ParserInput) -> Result<Vec<Element>> {
12    // 먼저 redirect 파서를 시도
13    if let Ok(redirect_element) = brace_redirect_parser(parser_input) {
14        return Ok(vec![redirect_element]);
15    }
16
17    // redirect가 아니면 기존처럼 모든 element 파싱
18    repeat(0.., element_parser)
19        .map(|elements: Vec<_>| elements.into_iter().flatten().collect())
20        .parse_next(parser_input)
21}