fluidattacks-blends-domain 0.41.0

Blends functional core: pure AST graph to syntax graph (no_std)
Documentation
//! Counterpart of the `Language` enum in `blends/models/__init__.py`.

use crate::syntax::dispatchers::{self, Dispatcher};

/// A source language this crate has a syntax-graph dispatcher for.
///
/// New grammars are added over time, so callers must not match this
/// exhaustively.
#[derive(Clone, Copy, PartialEq, Eq, Hash, Debug)]
#[non_exhaustive]
pub enum Language {
    /// C#.
    CSharp,
    /// Elixir.
    Elixir,
    /// Go.
    Go,
    /// `HashiCorp` Configuration Language (Terraform).
    Hcl,
    /// Java.
    Java,
    /// JavaScript.
    JavaScript,
    /// JSON.
    Json,
    /// Kotlin.
    Kotlin,
    /// PHP.
    Php,
    /// Python.
    Python,
    /// Ruby.
    Ruby,
    /// Rust.
    Rust,
    /// Scala.
    Scala,
    /// Swift.
    Swift,
    /// TypeScript.
    TypeScript,
    /// YAML.
    Yaml,
}

impl Language {
    /// The language a file extension (without its leading dot) implies, if any.
    #[must_use]
    pub fn from_extension(extension: &str) -> Option<Self> {
        match extension {
            "cs" => Some(Self::CSharp),
            "ex" | "exs" => Some(Self::Elixir),
            "go" => Some(Self::Go),
            "hcl" | "tf" => Some(Self::Hcl),
            "java" => Some(Self::Java),
            "js" | "jsx" => Some(Self::JavaScript),
            "json" => Some(Self::Json),
            "kt" | "ktm" | "kts" => Some(Self::Kotlin),
            "swift" => Some(Self::Swift),
            "ts" | "tsx" => Some(Self::TypeScript),
            "php" => Some(Self::Php),
            "py" => Some(Self::Python),
            "rb" => Some(Self::Ruby),
            "rs" => Some(Self::Rust),
            "scala" => Some(Self::Scala),
            "yaml" | "yml" => Some(Self::Yaml),
            _ => None,
        }
    }

    pub(crate) fn syntax_dispatcher(self) -> Option<Dispatcher> {
        match self {
            Self::CSharp => Some(dispatchers::c_sharp::dispatcher),
            Self::Go => Some(dispatchers::go::dispatcher),
            Self::Java => Some(dispatchers::java::dispatcher),
            Self::JavaScript => Some(dispatchers::javascript::dispatcher),
            Self::Json => Some(dispatchers::json::dispatcher),
            Self::Kotlin => Some(dispatchers::kotlin::dispatcher),
            Self::Php => Some(dispatchers::php::dispatcher),
            Self::Python => Some(dispatchers::python::dispatcher),
            Self::Ruby => Some(dispatchers::ruby::dispatcher),
            Self::Rust => Some(dispatchers::rust::dispatcher),
            Self::Swift => Some(dispatchers::swift::dispatcher),
            Self::TypeScript => Some(dispatchers::typescript::dispatcher),
            Self::Yaml => Some(dispatchers::yaml::dispatcher),
            _ => None,
        }
    }
}