Files

73 lines
2.1 KiB
Rust

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::<Vec<_>>();
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} <root-token> <BundlePackingInfo.bytes> <TableCatalog.bytes> <MediaCatalog.bytes> [platforms]"
);
}
fn parse_platforms(value: &str) -> Result<Vec<PatchPlatform>, String> {
value
.split(',')
.map(str::trim)
.filter(|part| !part.is_empty())
.map(parse_platform)
.collect()
}
fn parse_platform(value: &str) -> Result<PatchPlatform, String> {
match value.to_ascii_lowercase().as_str() {
"windows" | "win" => Ok(PatchPlatform::Windows),
"android" => Ok(PatchPlatform::Android),
_ => Err(format!("unsupported platform: {value}")),
}
}