use std::error::Error;
use std::path::Path;
use std::sync::Arc;
use std::time::Duration;
use kget::{
AdvancedDownloader, Config, DownloadOptions, Optimizer, ProxyConfig, ProxyType,
create_progress_bar, download,
torrent::{TorrentCallbacks, download_magnet},
verify_iso_integrity,
};
fn main() -> Result<(), Box<dyn Error + Send + Sync>> {
let mut args = std::env::args().skip(1);
let cmd = args.next().unwrap_or_else(|| "help".to_string());
match cmd.as_str() {
"simple" => run_simple(args)?,
"advanced" => run_advanced(args)?,
"auto-verify" => run_auto_verify(args)?,
"progress-only" => run_progress_demo(),
"verify-only" => run_verify_only(args)?,
"config-custom" => run_config_custom()?,
"torrent" => run_torrent(args)?,
_ => print_usage(),
}
Ok(())
}
fn print_usage() {
println!("╔══════════════════════════════════════════════════════════════╗");
println!("║ KGet Library Usage Examples ║");
println!("╠══════════════════════════════════════════════════════════════╣");
println!("║ simple <url> [output] │ Basic HTTP/HTTPS download ║");
println!("║ advanced <url> <output> │ Parallel chunks + callbacks ║");
println!("║ auto-verify <url> <output> │ ISO download with SHA256 check ║");
println!("║ progress-only │ Standalone progress bar demo ║");
println!("║ verify-only <path> │ Standalone SHA256 file checker ║");
println!("║ config-custom │ Programmatic config setup ║");
println!("║ torrent <magnet> [dir] │ Download via magnet link ║");
println!("╚══════════════════════════════════════════════════════════════╝");
}
fn run_simple(mut args: impl Iterator<Item = String>) -> Result<(), Box<dyn Error + Send + Sync>> {
let url = args.next().expect("Usage: simple <url> [output]");
let output = args.next();
let options = DownloadOptions {
output_path: output,
quiet_mode: false,
verify_iso: false,
expected_sha256: None,
};
println!("📥 Starting simple download: {}", url);
download(
&url,
ProxyConfig::default(),
Optimizer::new(),
options,
None,
)?;
println!("✅ Download complete!");
Ok(())
}
fn run_advanced(
mut args: impl Iterator<Item = String>,
) -> Result<(), Box<dyn Error + Send + Sync>> {
let url = args.next().expect("Usage: advanced <url> <output>");
let output = args.next().expect("Usage: advanced <url> <output>");
let mut downloader = AdvancedDownloader::new(
url.clone(),
output.clone(),
false, ProxyConfig::default(),
Optimizer::new(),
);
downloader.set_progress_callback(|progress| {
let percent = progress * 100.0;
let filled = (progress * 30.0) as usize;
let empty = 30 - filled;
print!(
"\r[{}{}] {:.1}%",
"█".repeat(filled),
"░".repeat(empty),
percent
);
use std::io::Write;
std::io::stdout().flush().ok();
});
downloader.set_status_callback(|msg| {
println!("\n📊 {}", msg);
});
println!("🚀 Starting advanced parallel download...");
println!(" URL: {}", url);
println!(" Output: {}", output);
downloader.download()?;
println!("\n✅ Download complete!");
Ok(())
}
fn run_auto_verify(
mut args: impl Iterator<Item = String>,
) -> Result<(), Box<dyn Error + Send + Sync>> {
let url = args.next().expect("Usage: auto-verify <url> <output>");
let output = args.next().expect("Usage: auto-verify <url> <output>");
let options = DownloadOptions {
output_path: Some(output.clone()),
verify_iso: true, quiet_mode: false,
expected_sha256: None,
};
println!("💿 Downloading ISO with automatic integrity check...");
println!(" URL: {}", url);
println!(" Output: {}", output);
download(
&url,
ProxyConfig::default(),
Optimizer::new(),
options,
Some(&|status| println!("📊 {}", status)), )?;
println!("✅ Download and verification complete!");
Ok(())
}
fn run_progress_demo() {
println!("🎨 KGet Progress Bar Demo\n");
let total_steps: u64 = 100;
let bar = create_progress_bar(
false, "Processing files".to_string(), Some(total_steps), false, );
for i in 0..total_steps {
std::thread::sleep(Duration::from_millis(30));
bar.set_position(i + 1);
}
bar.finish_with_message("✅ All files processed!");
println!("\n🔄 Spinner demo (unknown duration)...");
let spinner = create_progress_bar(
false,
"Connecting to server".to_string(),
None, false,
);
for _ in 0..50 {
std::thread::sleep(Duration::from_millis(50));
spinner.tick();
}
spinner.finish_with_message("✅ Connected!");
}
fn run_verify_only(
mut args: impl Iterator<Item = String>,
) -> Result<(), Box<dyn Error + Send + Sync>> {
let path = args.next().expect("Usage: verify-only <file_path>");
println!("🔐 Calculating SHA256 hash for: {}", path);
println!(" This may take a while for large files...\n");
verify_iso_integrity(Path::new(&path), Some(&|status| println!(" {}", status)))?;
println!("\n💡 Compare this hash with the one provided by the source.");
Ok(())
}
fn run_config_custom() -> Result<(), Box<dyn Error + Send + Sync>> {
println!("⚙️ Custom Configuration Demo\n");
let mut config = Config::load().unwrap_or_default();
config.proxy.enabled = true;
config.proxy.url = Some("http://proxy.example.com:8080".to_string());
config.proxy.proxy_type = ProxyType::Http;
config.optimization.max_connections = 8; config.optimization.compression = true; config.optimization.speed_limit = Some(5_000_000);
config.torrent.enabled = true;
config.torrent.dht_enabled = true;
config.torrent.max_peers = 100;
println!("📋 Configuration Summary:");
println!(
" Proxy: {} ({})",
config.proxy.url.as_deref().unwrap_or("none"),
if config.proxy.enabled {
"enabled"
} else {
"disabled"
}
);
println!(
" Max Connections: {}",
config.optimization.max_connections
);
println!(
" Speed Limit: {:?} bytes/s",
config.optimization.speed_limit
);
println!(" Torrent DHT: {}", config.torrent.dht_enabled);
println!("\n✅ Config ready! Pass config.proxy to download functions.");
let _downloader = AdvancedDownloader::new(
"https://example.com/file.zip".to_string(),
"file.zip".to_string(),
false,
config.proxy.clone(),
Optimizer::from_config(config.optimization),
);
Ok(())
}
fn run_torrent(mut args: impl Iterator<Item = String>) -> Result<(), Box<dyn Error + Send + Sync>> {
let magnet = args
.next()
.expect("Usage: torrent <magnet_link> [output_dir]");
let output_dir = args.next().unwrap_or_else(|| ".".to_string());
println!("🧲 Starting torrent download...");
println!(" Magnet: {}...", &magnet[..magnet.len().min(60)]);
println!(" Output: {}\n", output_dir);
let callbacks = TorrentCallbacks {
status: Some(Arc::new(|msg| {
println!("📊 {}", msg);
})),
progress: Some(Arc::new(|progress| {
let percent = progress * 100.0;
let filled = (progress * 30.0) as usize;
let empty = 30 - filled;
print!(
"\r🧲 [{}{}] {:.1}%",
"█".repeat(filled),
"░".repeat(empty),
percent
);
use std::io::Write;
std::io::stdout().flush().ok();
})),
};
download_magnet(
&magnet,
&output_dir,
false, ProxyConfig::default(),
Optimizer::new(),
callbacks,
)?;
println!("\n✅ Torrent download complete!");
Ok(())
}