nrcc_core 0.1.0

A code counter.
Documentation
use std::collections::HashMap;

use nom::{
    branch::alt,
    character::complete::anychar,
    combinator::{eof, map_res},
    multi::many_till,
};

use crate::{
    language::LanguageSyntax,
    parser::{tag_all, NomError},
};

pub fn multi_comment<'a>(
    leading_map: &mut HashMap<&'a str, usize>,
    trailing_map: &mut HashMap<&'a str, usize>,
    syntax: &LanguageSyntax,
    line: &'a str,
) -> Option<&'a str> {
    let mut line = line;
    loop {
        if leading_map.values().sum::<usize>() == trailing_map.values().sum::<usize>() {
            break Some(line);
        }
        if line.is_empty() {
            break None;
        } else if let Ok((rest, (_, (tagging, flag)))) = many_till(
            anychar,
            alt((
                map_res(tag_all(syntax.doc_comment_pairs, |p| p.right), |r| {
                    Ok::<_, NomError>((r.right, false))
                }),
                map_res(tag_all(syntax.comment_pairs, |p| p.right), |r| {
                    Ok::<_, NomError>((r.right, false))
                }),
                map_res(tag_all(syntax.doc_comment_pairs, |p| p.left), |r| {
                    Ok::<_, NomError>((r.left, true))
                }),
                map_res(tag_all(syntax.comment_pairs, |p| p.left), |r| {
                    Ok::<_, NomError>((r.left, true))
                }),
                map_res(eof, |_| Ok::<_, NomError>(("", false))),
            )),
        )(line)
        {
            line = rest;
            if tagging.is_empty() {
                continue;
            } else if flag {
                *leading_map.entry(tagging).or_insert(0) += 1;
                continue;
            } else {
                *trailing_map.entry(tagging).or_insert(0) += 1;
                continue;
            }
        }
    }
}