use clap::{Args, Subcommand, ValueHint};
use facti_api::blocking::ApiClient;
use facti_lib::FactorioVersion;
#[derive(Args, Debug)]
pub struct PortalArgs {
#[arg(short, long)]
pub json: bool,
#[command(subcommand)]
pub command: PortalCommands,
}
#[derive(Subcommand, Debug)]
pub enum PortalCommands {
Search(PortalSearchArgs),
Show(PortalShowArgs),
}
#[derive(clap::Args, Debug)]
pub struct PortalSearchArgs {
#[arg(short, long)]
pub deprecated: bool,
#[arg(short, long, default_value_t = 1)]
pub page: u32,
#[arg(short = 'n', long = "size", value_name = "SIZE")]
pub page_size: Option<facti_api::data::pagination::PageSize>,
#[arg(short, long = "sort", value_name = "SORT")]
pub sort_mode: Option<facti_api::data::sorting::SortMode>,
#[arg(short = 'o', long = "order", value_name = "ORDER")]
pub sort_order: Option<facti_api::data::sorting::SortOrder>,
#[arg(short, long)]
pub factorio_version: Option<FactorioVersion>,
#[arg(value_hint = ValueHint::Other)]
pub names: Vec<String>,
}
#[derive(clap::Args, Debug)]
pub struct PortalShowArgs {
#[arg(short, long)]
pub full: bool,
pub name: String,
}
impl PortalArgs {
pub fn run(&self, client: &ApiClient) -> anyhow::Result<()> {
match &self.command {
PortalCommands::Search(args) => args.run(client, self.json),
PortalCommands::Show(args) => args.run(client, self.json),
}
}
}
impl PortalSearchArgs {
pub fn run(&self, client: &ApiClient, json: bool) -> anyhow::Result<()> {
let query = facti_api::data::portal::SearchQuery {
hide_deprecated: !self.deprecated,
page: self.page,
page_size: self.page_size,
sort: self.sort_mode,
sort_order: self.sort_order,
version: self.factorio_version,
namelist: match &self.names {
names if names.is_empty() => None,
names => Some(names.to_vec()),
},
};
let response = client.search(&query)?;
if json {
println!("{}", serde_json::to_string_pretty(&response)?);
} else {
for item in response.results {
println!("{}", item);
}
}
Ok(())
}
}
impl PortalShowArgs {
pub fn run(&self, client: &ApiClient, json: bool) -> anyhow::Result<()> {
let response = if self.full {
client.info_full(&self.name)?
} else {
client.info_short(&self.name)?
};
if json {
println!("{}", serde_json::to_string_pretty(&response)?);
} else {
println!("{}", response);
}
Ok(())
}
}