use bat_adapters::official::inventory::YostarJpDownloadInventory; use bat_adapters::official::yostar_jp::{ verified_official_platforms, PatchPlatform, YostarJpResourceRoot, }; use std::env; use std::fs; fn main() -> anyhow::Result<()> { let args = env::args().collect::>(); if args.len() < 5 { print_usage(&args[0]); std::process::exit(2); } let root_token = &args[1]; let bundle_packing_info_path = &args[2]; let table_catalog_path = &args[3]; let media_catalog_path = &args[4]; let platforms = args .get(5) .map(|value| parse_platforms(value)) .transpose() .map_err(anyhow::Error::msg)? .unwrap_or_else(verified_official_platforms); let inventory = YostarJpDownloadInventory::from_catalog_bytes( &fs::read(bundle_packing_info_path)?, &fs::read(table_catalog_path)?, &fs::read(media_catalog_path)?, ); let root = YostarJpResourceRoot::from_root_token(root_token).map_err(anyhow::Error::msg)?; println!( "bundle_patch_pack_count={}", inventory.bundle_patch_pack_names.len() ); println!("table_file_count={}", inventory.table_file_names.len()); println!("media_file_count={}", inventory.media_file_names.len()); println!(); for url in inventory .direct_download_urls_for_platforms(&root, &platforms) .map_err(anyhow::Error::msg)? { println!("{url}"); } Ok(()) } fn print_usage(binary: &str) { eprintln!( "usage: {binary} [platforms]" ); } fn parse_platforms(value: &str) -> Result, String> { value .split(',') .map(str::trim) .filter(|part| !part.is_empty()) .map(parse_platform) .collect() } fn parse_platform(value: &str) -> Result { match value.to_ascii_lowercase().as_str() { "windows" | "win" => Ok(PatchPlatform::Windows), "android" => Ok(PatchPlatform::Android), _ => Err(format!("unsupported platform: {value}")), } }