pub mod braced;
mod contract_tokens;
pub mod docs;
pub mod facts;
pub mod graphql;
pub mod hcl;
pub mod markup;
pub mod protobuf;
pub mod python;
pub mod script;
pub mod shell;
pub mod sql;
pub mod style;
pub mod syntax;
pub mod token;
pub use facts::{
Contract, ContractKind, Declaration, DeclarationKind, Facts, GraphqlOperation, GraphqlType,
Import, ImportBinding, ParseDiagnostic, Reference, ReferenceKind, Span,
};
pub use syntax::{Language, Syntax};
pub use token::{Mode, Token, TokenKind, Tokenizer, tokenize, tokenize_lite};
#[must_use]
pub fn extract(source: &str, language: Language) -> Facts {
match language {
Language::JavaScript | Language::TypeScript => script::extract(source, language),
Language::Graphql => graphql::extract(source),
Language::Protobuf => protobuf::extract(source),
Language::Python => python::extract(source),
Language::Sql => sql::extract(source),
Language::Terraform => hcl::extract(source),
Language::Bash => shell::extract(source),
Language::Markdown | Language::Mdx | Language::ReStructuredText | Language::AsciiDoc => {
docs::extract(source, language)
}
Language::Html | Language::Xml => markup::extract(source, language),
Language::Css | Language::Scss => style::extract(source, language),
Language::Rust
| Language::Go
| Language::Java
| Language::CSharp
| Language::C
| Language::Cpp
| Language::Solidity
| Language::Swift => braced::extract(source, language),
_ => Facts::default(),
}
}
#[must_use]
pub fn extract_path(path: &str, source: &str) -> Option<Facts> {
let extension = path.rsplit_once('.')?.1;
let language = Language::from_extension(extension)?;
Some(extract(source, language))
}