pub mod cached_client;
pub mod cdn_config;
pub mod commands;
pub mod config_manager;
pub mod fallback_client;
pub mod manifest;
pub mod output;
pub mod pattern_extraction;
pub mod wago_api;
pub mod test_constants {
pub const EXAMPLE_CERT_HASH: &str = "5168ff90af0207753cccd9656462a212b859723b";
}
pub use crate::commands::{
certs::handle as handle_certs, config::handle as handle_config,
download::handle as handle_download, inspect::handle as handle_inspect,
install::handle as handle_install, listfile::handle as handle_listfile,
products::handle as handle_products, storage::handle as handle_storage,
};
use clap::Subcommand;
use std::path::PathBuf;
#[derive(Subcommand)]
pub enum ProductsCommands {
List {
#[arg(short, long)]
filter: Option<String>,
#[arg(short, long, default_value = "us")]
region: String,
},
Versions {
product: String,
#[arg(short, long, default_value = "us")]
region: String,
#[arg(short, long)]
all_regions: bool,
#[arg(long)]
parse_config: bool,
},
Cdns {
product: String,
#[arg(short, long, default_value = "us")]
region: String,
},
Info {
product: String,
#[arg(short, long)]
region: Option<String>,
},
Builds {
product: String,
#[arg(short, long)]
filter: Option<String>,
#[arg(long)]
days: Option<u32>,
#[arg(long)]
limit: Option<usize>,
#[arg(long)]
bgdl_only: bool,
},
}
#[derive(Subcommand)]
pub enum StorageCommands {
Init {
#[arg(default_value = ".")]
path: PathBuf,
#[arg(short, long)]
product: Option<String>,
},
Info {
#[arg(default_value = ".")]
path: PathBuf,
},
Config {
#[arg(default_value = ".")]
path: PathBuf,
},
Stats {
#[arg(default_value = ".")]
path: PathBuf,
},
Verify {
#[arg(default_value = ".")]
path: PathBuf,
#[arg(short, long)]
fix: bool,
},
Read {
path: PathBuf,
ekey: String,
#[arg(short = 'O', long)]
output: Option<PathBuf>,
},
Write {
path: PathBuf,
ekey: String,
#[arg(short = 'I', long)]
input: Option<PathBuf>,
},
List {
#[arg(default_value = ".")]
path: PathBuf,
#[arg(short, long)]
detailed: bool,
#[arg(short = 'n', long)]
limit: Option<usize>,
},
Rebuild {
#[arg(default_value = ".")]
path: PathBuf,
#[arg(short, long)]
force: bool,
},
Optimize {
#[arg(default_value = ".")]
path: PathBuf,
},
Repair {
#[arg(default_value = ".")]
path: PathBuf,
#[arg(short = 'n', long)]
dry_run: bool,
},
Clean {
#[arg(default_value = ".")]
path: PathBuf,
#[arg(short = 'n', long)]
dry_run: bool,
},
Extract {
ekey: String,
#[arg(long, default_value = ".")]
path: PathBuf,
#[arg(short = 'O', long)]
output: Option<PathBuf>,
#[arg(long)]
listfile: Option<PathBuf>,
#[arg(long)]
resolve_filename: bool,
},
ExtractById {
fdid: u32,
#[arg(long, default_value = ".")]
path: PathBuf,
#[arg(short = 'O', long)]
output: Option<PathBuf>,
#[arg(long)]
root_manifest: Option<PathBuf>,
#[arg(long)]
encoding_manifest: Option<PathBuf>,
},
ExtractByName {
filename: String,
#[arg(long, default_value = ".")]
path: PathBuf,
#[arg(short = 'O', long)]
output: Option<PathBuf>,
#[arg(long)]
root_manifest: Option<PathBuf>,
#[arg(long)]
encoding_manifest: Option<PathBuf>,
#[arg(long)]
listfile: Option<PathBuf>,
},
LoadManifests {
#[arg(default_value = ".")]
path: PathBuf,
#[arg(long)]
root_manifest: Option<PathBuf>,
#[arg(long)]
encoding_manifest: Option<PathBuf>,
#[arg(long)]
listfile: Option<PathBuf>,
#[arg(long, default_value = "all")]
locale: String,
#[arg(long)]
info_only: bool,
},
}
#[derive(Subcommand)]
pub enum ListfileCommands {
Download {
#[arg(long, default_value = ".")]
output: PathBuf,
#[arg(short, long)]
force: bool,
},
Info {
#[arg(default_value = "community-listfile.csv")]
path: PathBuf,
},
Search {
pattern: String,
#[arg(default_value = "community-listfile.csv")]
path: PathBuf,
#[arg(short, long)]
ignore_case: bool,
#[arg(short, long, default_value = "50")]
limit: usize,
},
}
#[derive(Subcommand)]
pub enum DownloadCommands {
Build {
product: String,
build: String,
#[arg(long, default_value = ".")]
output: PathBuf,
#[arg(short, long, default_value = "us")]
region: String,
#[arg(long)]
dry_run: bool,
#[arg(long)]
tags: Option<String>,
},
Files {
product: String,
patterns: Vec<String>,
#[arg(long, default_value = ".")]
output: PathBuf,
#[arg(short, long)]
build: Option<String>,
#[arg(long)]
dry_run: bool,
#[arg(long)]
tags: Option<String>,
#[arg(long)]
limit: Option<usize>,
},
Resume {
session: String,
},
TestResume {
hash: String,
#[arg(short = 'H', long, default_value = "blzddist1-a.akamaihd.net")]
host: String,
#[arg(long, default_value = "test_download.bin")]
output: PathBuf,
#[arg(short, long)]
resumable: bool,
},
}
#[derive(Subcommand)]
pub enum InstallCommands {
Game {
product: String,
#[arg(long, default_value = ".")]
path: PathBuf,
#[arg(short, long)]
build: Option<String>,
#[arg(short, long, default_value = "us")]
region: String,
#[arg(short = 't', long, value_enum, default_value = "minimal")]
install_type: InstallType,
#[arg(long)]
resume: bool,
#[arg(short = 'v', long)]
verify: bool,
#[arg(long)]
dry_run: bool,
#[arg(long, default_value = "5")]
max_concurrent: usize,
#[arg(long)]
tags: Option<String>,
},
Repair {
#[arg(long, default_value = ".")]
path: PathBuf,
#[arg(short = 'v', long)]
verify_checksums: bool,
#[arg(long)]
dry_run: bool,
#[arg(long, default_value = "5")]
max_concurrent: usize,
},
}
#[derive(clap::ValueEnum, Clone, Copy, Debug, PartialEq)]
pub enum InstallType {
Minimal,
Full,
Custom,
MetadataOnly,
}
#[derive(Subcommand)]
pub enum InspectCommands {
Bpsv {
input: String,
#[arg(short, long)]
raw: bool,
},
BuildConfig {
product: String,
build: String,
#[arg(short, long, default_value = "us")]
region: String,
},
CdnConfig {
product: String,
#[arg(short, long, default_value = "us")]
region: String,
},
Encoding {
product: String,
#[arg(short, long, default_value = "us")]
region: String,
#[arg(short, long)]
stats: bool,
#[arg(long)]
search: Option<String>,
#[arg(long, default_value = "20")]
limit: usize,
},
Install {
product: String,
#[arg(short, long, default_value = "us")]
region: String,
#[arg(long)]
tags: Option<String>,
#[arg(long)]
all: bool,
},
DownloadManifest {
product: String,
#[arg(short, long, default_value = "us")]
region: String,
#[arg(long, default_value = "10")]
priority_limit: usize,
#[arg(long)]
tags: Option<String>,
},
Size {
product: String,
#[arg(short, long, default_value = "us")]
region: String,
#[arg(long, default_value = "10")]
largest: usize,
#[arg(long)]
tags: Option<String>,
},
}
#[derive(Subcommand)]
pub enum ConfigCommands {
Show,
Set {
key: String,
value: String,
},
Get {
key: String,
},
Reset {
#[arg(short, long)]
yes: bool,
},
}
#[derive(Subcommand)]
pub enum CertsCommands {
Download {
ski: String,
#[arg(long)]
output: Option<PathBuf>,
#[arg(short, long, default_value = "us")]
region: String,
#[arg(short = 'F', long = "cert-format", value_enum, default_value = "pem")]
cert_format: CertFormat,
#[arg(short, long)]
details: bool,
},
}
#[derive(clap::ValueEnum, Clone, Copy, Debug, PartialEq)]
pub enum CertFormat {
Pem,
Der,
}
#[derive(clap::ValueEnum, Clone, Copy, Debug, PartialEq)]
pub enum OutputFormat {
Text,
Json,
JsonPretty,
Bpsv,
}
#[derive(Clone, Debug)]
pub struct CommandContext {
pub format: OutputFormat,
pub no_color: bool,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_output_format_debug() {
assert_eq!(format!("{:?}", OutputFormat::Text), "Text");
assert_eq!(format!("{:?}", OutputFormat::Json), "Json");
assert_eq!(format!("{:?}", OutputFormat::JsonPretty), "JsonPretty");
assert_eq!(format!("{:?}", OutputFormat::Bpsv), "Bpsv");
}
}