mod extractor;
pub mod parser;
pub mod types;
pub use extractor::extract_compressed;
pub use parser::{SupportedLanguage, new_parser};
pub use types::{CompressedOutput, CompressionMode};
pub fn compress_source(
source: &[u8],
language: SupportedLanguage,
mode: CompressionMode,
) -> anyhow::Result<CompressedOutput> {
if mode == CompressionMode::None {
return Ok(CompressedOutput {
content: String::from_utf8_lossy(source).into_owned(),
items_extracted: 0,
had_parse_errors: false,
});
}
let mut parser = new_parser(language)?;
let tree = parser
.parse(source, None)
.ok_or_else(|| anyhow::anyhow!("Tree-sitter returned no parse tree"))?;
Ok(extract_compressed(source, &tree, language, mode))
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn compress_source_rust_signatures() {
let source = b"use std::io;\n\npub fn run() -> Result<(), Error> {\n Ok(())\n}\n";
let output = compress_source(
source,
SupportedLanguage::Rust,
CompressionMode::Signatures,
)
.unwrap();
assert!(output.content.contains("use std::io"));
assert!(output.content.contains("pub fn run()"));
assert!(output.content.contains("{ … }"));
assert!(!output.content.contains("Ok(())"));
}
#[test]
fn compress_source_none_returns_full() {
let source = b"fn main() { println!(\"hi\"); }\n";
let output = compress_source(
source,
SupportedLanguage::Rust,
CompressionMode::None,
)
.unwrap();
assert_eq!(output.content.as_bytes(), source);
assert_eq!(output.items_extracted, 0);
}
#[test]
fn compress_source_python_class() {
let source = b"class Foo:\n def bar(self):\n return 42\n";
let output = compress_source(
source,
SupportedLanguage::Python,
CompressionMode::Signatures,
)
.unwrap();
assert!(output.content.contains("class Foo"));
assert!(!output.content.contains("return 42"));
}
#[test]
fn compress_source_go_function() {
let source =
b"package main\n\nfunc Hello() string {\n\treturn \"hello\"\n}\n";
let output = compress_source(
source,
SupportedLanguage::Go,
CompressionMode::Signatures,
)
.unwrap();
assert!(output.content.contains("package main"));
assert!(output.content.contains("func Hello()"));
assert!(output.content.contains("{ … }"));
}
}