use clap::Parser;
use log::{error, info};
use petrify::config::Config;
use petrify::engine::Petrifier;
#[derive(Parser)]
#[command(name = "petrify")]
#[command(about = "Petrify live websites into static offline copies")]
#[command(version)]
struct Cli {
#[arg(required = true)]
url: String,
#[arg(short, long, default_value = "unlimited")]
depth: String,
#[arg(long, default_value_t = 0)]
max_pages: usize,
#[arg(
long,
value_delimiter = ',',
default_value = "js,css,images,video,html,pdf"
)]
download_only: Vec<String>,
#[arg(short, long, default_value_t = num_cpus::get())]
max_concurrent: usize,
#[arg(short, long, default_value = "./petrified_site")]
output: String,
#[arg(long, default_value_t = true)]
download_external: bool,
#[arg(long, default_value_t = true)]
convert_to_webp: bool,
#[arg(long, default_value_t = 75)]
webp_quality: u8,
#[arg(long, default_value_t = false)]
webp_lossless: bool,
#[arg(short, long, default_value_t = true)]
ignore_robots: bool,
#[arg(long, default_value_t = 270)]
timeout: u64,
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
env_logger::init();
let cli = Cli::parse();
info!("Starting petrify");
info!("Target URL: {}", cli.url);
info!("Output directory: {}", cli.output);
let config = Config {
url: cli.url,
depth: cli.depth,
max_pages: cli.max_pages,
download_only: cli.download_only,
max_concurrent: cli.max_concurrent,
output: cli.output,
download_external: cli.download_external,
convert_to_webp: cli.convert_to_webp,
webp_quality: cli.webp_quality,
webp_lossless: cli.webp_lossless,
ignore_robots: cli.ignore_robots,
timeout: cli.timeout,
};
let mut petrifier = Petrifier::new(config).await?;
match petrifier.run().await {
Ok(_) => {
info!("Petrify completed successfully!");
Ok(())
}
Err(e) => {
error!("Petrify failed: {}", e);
Err(e.into())
}
}
}