use clap::Parser;
use megalib::public::open_folder;
use tracing_subscriber::{EnvFilter, fmt};
#[derive(Debug, Parser)]
#[command(name = "folder")]
struct Args {
folder_url: String,
}
fn init_tracing() {
let filter = EnvFilter::try_from_default_env().unwrap_or_else(|_| EnvFilter::new("off"));
fmt().with_env_filter(filter).with_target(false).init();
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
init_tracing();
let args = Args::parse();
println!("Opening public folder...");
let folder = open_folder(&args.folder_url).await?;
println!("\nFolder contents:");
println!("{:-<60}", "");
let root = folder.nodes().first().expect("Empty folder");
let root_path = root.path().unwrap_or("/");
println!("{} (root)\n", root.name);
for node in folder.list(root_path, false) {
let prefix = if node.node_type.is_container() {
"[D]"
} else {
"[F]"
};
if node.size > 0 {
println!("{} {} ({} bytes)", prefix, node.name, node.size);
} else {
println!("{} {}", prefix, node.name);
}
}
let total_files = folder
.nodes()
.iter()
.filter(|n| !n.node_type.is_container())
.count();
let total_subfolders = folder
.nodes()
.iter()
.filter(|n| n.node_type.is_container() && n.path().unwrap_or("") != root_path)
.count();
let total_size: u64 = folder.nodes().iter().map(|n| n.size).sum();
println!("\n{:-<60}", "");
println!(
"Contents: {} files, {} subfolders (Total size: {} bytes)",
total_files, total_subfolders, total_size
);
Ok(())
}