nrcc_core 0.1.1

A code counter.
Documentation
use nom::bytes::complete::{tag, take_until};

use crate::{
    error::CoreError,
    language::{LanguageType, SyntaxPair},
    parser::{NomError, ParseResult},
};

use super::CoreParser;

pub fn split_sublang_part<'a>(
    pair: &SyntaxPair,
    sub_lang: &LanguageType,
    leading: &'a str,
    lines: &mut impl Iterator<Item = &'a str>,
) -> Result<(&'a str, ParseResult), CoreError> {
    let finish_tag = pair.right;
    let mut sublang_content: Vec<&'a str> = Vec::new();
    {
        let line = leading;
        if let Ok((rest, content)) = take_until::<_, _, NomError>(finish_tag)(line) {
            sublang_content.push(content);
            let syntax = sub_lang.get_language_syntax();
            let result = CoreParser::parse_lines(sublang_content.clone().into_iter(), &syntax)?;
            let (rest, _) = tag::<_, _, NomError>(finish_tag)(rest)?;
            return Ok((rest, result));
        } else {
            sublang_content.push(line);
        }
    }
    loop {
        if let Some(line) = lines.next() {
            if let Ok((rest, content)) = take_until::<_, _, NomError>(finish_tag)(line) {
                sublang_content.push(content);
                let syntax = sub_lang.get_language_syntax();
                let result = CoreParser::parse_lines(sublang_content.clone().into_iter(), &syntax)?;
                let (rest, _) = tag::<_, _, NomError>(finish_tag)(rest)?;
                break Ok((rest, result));
            } else {
                sublang_content.push(line);
                continue;
            }
        } else {
            break Err(CoreError::SyntaxError(
                "Ended sub language part.".to_string(),
            ));
        }
    }
}