use ragrig::{
ChunkConfig, ChunkedText, Chunker, MarkdownChunker,
parsers::{DocumentParsers, build_parsers, chunk_text, extract_text},
};
use std::env;
use std::path::Path;
#[tokio::main]
async fn main() -> anyhow::Result<()> {
let path = env::args().nth(1).unwrap_or_else(|| {
eprintln!("Usage: cargo run --example minimal -- <file.pdf|file.epub|file.html>");
std::process::exit(1);
});
let path = Path::new(&path);
if !path.exists() {
anyhow::bail!("File not found: {}", path.display());
}
let parsers = DocumentParsers::new(build_parsers());
let config = ChunkConfig::default();
let markdown = extract_text(&parsers, path)?;
println!(
"{} {} bytes of Markdown extracted",
path.display(),
markdown.len()
);
let chunker: Box<dyn Chunker> = Box::new(MarkdownChunker);
let chunks: Vec<ChunkedText> = chunker.chunk(&markdown, &config).await?;
println!(
"{} chunks (strategy='{}', size={}, overlap={})",
chunks.len(),
chunker.name(),
config.size,
config.overlap
);
for (i, chunk) in chunks.iter().take(3).enumerate() {
let section = chunk.section.as_deref().unwrap_or("(no section)");
let preview: String = chunk.text.chars().take(120).collect();
println!("\n── chunk {} [{section}] ──\n{}…", i + 1, preview);
}
if chunks.len() > 3 {
println!("\n… and {} more chunks.", chunks.len() - 3);
}
let plain = "A stand-alone string. ".repeat(400);
let text_chunks = chunk_text(&plain, &config);
println!(
"\nchunk_text: {} plain-text chunks (size={}, overlap={})",
text_chunks.len(),
config.size,
config.overlap
);
for (i, tc) in text_chunks.iter().take(3).enumerate() {
let preview: String = tc.chars().take(60).collect();
println!(" chunk {}: '{}…'", i + 1, preview);
}
Ok(())
}