#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct LanguageStats {
pub language: Language,
pub file_count: usize,
pub total_lines: usize,
pub code_lines: usize,
pub comment_lines: usize,
pub blank_lines: usize,
}
pub struct LanguageRegistry {
supported_languages: Vec<Language>,
}
impl Default for LanguageRegistry {
fn default() -> Self {
Self::new()
}
}
impl LanguageRegistry {
#[must_use]
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn new() -> Self {
let supported_languages = vec![
Language::Rust,
Language::C,
Language::Cpp,
Language::Go,
Language::Zig,
Language::Java,
Language::Kotlin,
Language::Scala,
Language::Groovy,
Language::Clojure,
Language::CSharp,
Language::FSharp,
Language::VisualBasic,
Language::Python,
Language::JavaScript,
Language::TypeScript,
Language::Ruby,
Language::PHP,
Language::Perl,
Language::Lua,
Language::Haskell,
Language::Elixir,
Language::Erlang,
Language::OCaml,
Language::ReasonML,
Language::Elm,
Language::PureScript,
Language::Lean,
Language::Swift,
Language::ObjectiveC,
Language::Dart,
Language::Bash,
Language::Zsh,
Language::Fish,
Language::PowerShell,
Language::SQL,
Language::HCL,
Language::YAML,
Language::TOML,
Language::JSON,
Language::XML,
Language::Markdown,
Language::LaTeX,
Language::AsciiDoc,
Language::Makefile,
Language::CMake,
Language::Bazel,
Language::Gradle,
Language::Maven,
Language::Solidity,
Language::VHDL,
Language::Verilog,
Language::R,
Language::Julia,
Language::Matlab,
Language::Assembly,
];
Self {
supported_languages,
}
}
#[must_use]
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn supported_languages(&self) -> &[Language] {
&self.supported_languages
}
#[must_use]
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn language_count(&self) -> usize {
self.supported_languages.len()
}
#[must_use]
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "path_exists")]
pub fn detect_language(&self, path: &Path) -> Language {
Language::from_path(path)
}
#[must_use]
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn ast_supported_languages(&self) -> Vec<Language> {
self.supported_languages
.iter()
.filter(|lang| lang.has_ast_support())
.copied()
.collect()
}
#[must_use]
#[provable_contracts_macros::contract("pmat-core.yaml", equation = "check_compliance")]
pub fn complexity_supported_languages(&self) -> Vec<Language> {
self.supported_languages
.iter()
.filter(|lang| lang.supports_complexity())
.copied()
.collect()
}
}