use std::fs::File;
use std::io::{self, BufRead, BufReader, Write};
use anyhow::Context;
use bzip2::read::MultiBzDecoder;
use clap::Parser;
use ruwex::tools::extract_page::extract_page;
#[derive(Parser, Debug)]
#[command(
name = "extractPage",
about = "Wikipedia Page Extractor: extracts a single page from a Wikipedia dump file.",
disable_version_flag = true
)]
struct Args {
input: Option<String>,
#[arg(long, default_value = "1")]
id: String,
#[arg(long)]
template: bool,
#[arg(short = 'v', long = "version")]
version: bool,
}
fn main() {
if let Err(error) = run() {
eprintln!("error: {error:#}");
std::process::exit(1);
}
}
fn run() -> anyhow::Result<()> {
let args = Args::parse();
if args.version {
println!("extractPage {} (ruwex)", env!("CARGO_PKG_VERSION"));
return Ok(());
}
let input = args
.input
.context("the following arguments are required: input")?;
let file = File::open(&input).with_context(|| format!("cannot open {input}"))?;
let reader: Box<dyn BufRead> = if input.to_lowercase().ends_with(".bz2") {
Box::new(BufReader::new(MultiBzDecoder::new(BufReader::new(file))))
} else {
Box::new(BufReader::new(file))
};
let stdout = io::stdout();
let mut out = io::BufWriter::new(stdout.lock());
extract_page(reader, &mut out, &args.id, args.template)?;
out.flush()?;
Ok(())
}