nrcc_core 0.1.0

A code counter.
Documentation
use super::LanguageType;

#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub enum SyntaxType {
    Soi,
    Blank,
    Code,
    DocString,
    LitString,
    String,
    DocMultiComment,
    MultiComment,
    DocComment,
    SimpleComment,
    SubLanguage,
    Eoi,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SyntaxPair {
    pub name: &'static str,
    pub left: &'static str,
    pub right: &'static str,
}

#[derive(Debug, Clone)]
pub struct LanguageSyntax {
    pub line_prefix: Option<&'static str>,
    pub ignore_prefix_space: bool,
    pub(crate) doc_comment: &'static [&'static str],
    pub(crate) simple_comment: &'static [&'static str],
    pub(crate) block_pairs: &'static [SyntaxPair],
    pub(crate) doc_comment_pairs: &'static [SyntaxPair],
    pub(crate) comment_pairs: &'static [SyntaxPair],
    pub(crate) literal_quote_pairs: &'static [SyntaxPair],
    pub(crate) quote_pairs: &'static [SyntaxPair],
    pub(crate) doc_quote_pairs: &'static [SyntaxPair],
    pub(crate) sublang_pairs: &'static [(SyntaxPair, LanguageType)],
}

impl LanguageSyntax {
    pub fn find_right_block_pair(&self, left: &str) -> Option<&SyntaxPair> {
        self.block_pairs.iter().find(|&p| p.left == left)
    }
    pub fn find_left_block_pair(&self, right: &str) -> Vec<&SyntaxPair> {
        let mut ls = Vec::new();
        for p in self.block_pairs.iter() {
            if p.right == right {
                ls.push(p);
            }
        }
        ls
    }

    pub fn find_right_comment_pair(&self, left: &str) -> Option<&SyntaxPair> {
        self.comment_pairs.iter().find(|&p| p.left == left)
    }
    pub fn find_left_comment_pair(&self, right: &str) -> Vec<&SyntaxPair> {
        let mut ls = Vec::new();
        for p in self.comment_pairs.iter() {
            if p.right == right {
                ls.push(p);
            }
        }
        ls
    }

    pub fn find_right_doc_comment_pair(&self, left: &str) -> Option<&SyntaxPair> {
        self.doc_comment_pairs.iter().find(|&p| p.left == left)
    }
    pub fn find_left_doc_comment_pair(&self, right: &str) -> Vec<&SyntaxPair> {
        let mut ls = Vec::new();
        for p in self.doc_comment_pairs.iter() {
            if p.right == right {
                ls.push(p);
            }
        }
        ls
    }

    pub fn find_right_quote_pair(&self, left: &str) -> Option<&SyntaxPair> {
        self.quote_pairs.iter().find(|&p| p.left == left)
    }
    pub fn find_left_quote_pair(&self, right: &str) -> Vec<&SyntaxPair> {
        let mut ls = Vec::new();
        for p in self.quote_pairs.iter() {
            if p.right == right {
                ls.push(p);
            }
        }
        ls
    }

    pub fn find_right_lit_quote_pair(&self, left: &str) -> Option<&SyntaxPair> {
        self.literal_quote_pairs.iter().find(|&p| p.left == left)
    }
    pub fn find_left_lit_quote_pair(&self, right: &str) -> Vec<&SyntaxPair> {
        let mut ls = Vec::new();
        for p in self.literal_quote_pairs.iter() {
            if p.right == right {
                ls.push(p);
            }
        }
        ls
    }

    pub fn find_right_sublang_pair(&self, left: &str) -> Option<&(SyntaxPair, LanguageType)> {
        self.sublang_pairs.iter().find(|&p| p.0.left == left)
    }
    pub fn find_left_sublang_pair(&self, right: &str) -> Option<&(SyntaxPair, LanguageType)> {
        self.sublang_pairs.iter().find(|&p| p.0.right == right)
    }
}