codesnap 0.13.2

Pure Rust library for generating beautiful code snapshots
Documentation
#[cfg(feature = "auto-detect")]
use hyperpolyglot_fork::detectors::classify;
use syntect::parsing::{SyntaxReference, SyntaxSet};

use crate::components::interface::render_error::RenderError;

pub struct SyntaxProvider {
    pub syntax_set: SyntaxSet,
}

impl SyntaxProvider {
    pub fn guess_syntax(
        &self,
        language: Option<String>,
        code_file_path: Option<String>,
        code: &str,
    ) -> Result<SyntaxReference, RenderError> {
        let syntax = match &language {
            Some(language) => self.syntax_set.find_syntax_by_token(&language),
            None => match &code_file_path {
                Some(file_path) => self
                    .syntax_set
                    .find_syntax_for_file(&file_path)
                    .map_err(|_| RenderError::NoSuchFile(file_path.clone()))?,
                None => self.syntax_set.find_syntax_by_first_line(code),
            },
        };

        #[cfg(feature = "auto-detect")]
        let syntax = syntax.or_else(|| {
            self.syntax_set
                .find_syntax_by_token(classify(code, &*vec![]))
        });

        let syntax = syntax.unwrap_or_else(|| self.syntax_set.find_syntax_plain_text());

        Ok(syntax.to_owned())
    }

    pub fn new() -> SyntaxProvider {
        let syntax_set = two_face::syntax::extra_newlines();

        SyntaxProvider { syntax_set }
    }
}