Skip to main content

sevenmark_parser/parser/
document.rs

1use crate::parser::ParserInput;
2use crate::parser::brace::brace_redirect_parser;
3use crate::parser::element::element_parser;
4use sevenmark_ast::Element;
5use winnow::Result;
6use winnow::combinator::opt;
7use winnow::prelude::*;
8
9/// 문서 파서 - element들을 반복 파싱 (기존 many0 + alt 패턴)
10/// redirect가 문서 시작에 있으면 그것만 반환하고 파싱 중단
11pub fn document_parser(parser_input: &mut ParserInput) -> Result<Vec<Element>> {
12    // 문서 시작이 redirect라면 redirect만 허용한다.
13    // 실패는 곧 문서 파싱 실패로 전파해 상위에서 Error element로 처리한다.
14    if parser_input.input.starts_with("{{{#redirect") {
15        return brace_redirect_parser(parser_input).map(|redirect| vec![redirect]);
16    }
17
18    // redirect가 아니면 기존처럼 모든 element 파싱
19    opt(element_parser)
20        .map(|elements| elements.unwrap_or_default())
21        .parse_next(parser_input)
22}