mod metadata;
mod presets;
mod translations;
use anyhow::Result;
use clap::Subcommand;
use std::path::PathBuf;
use crate::output::OutputFormat;
use raps_derivative::DerivativeClient;
#[derive(Debug, Subcommand)]
pub enum TranslateCommands {
Start {
urn: Option<String>,
#[arg(short, long)]
format: Option<String>,
#[arg(short, long)]
root_filename: Option<String>,
#[arg(short, long)]
wait: bool,
#[arg(long, default_value = "US")]
region: String,
#[arg(long)]
force: bool,
},
Status {
urn: String,
#[arg(short, long)]
wait: bool,
},
Manifest {
urn: String,
},
Derivatives {
urn: String,
#[arg(short, long)]
format: Option<String>,
},
Download {
urn: String,
#[arg(short, long)]
format: Option<String>,
#[arg(short, long)]
guid: Option<String>,
#[arg(long = "out-dir")]
out_dir: Option<PathBuf>,
#[arg(short, long)]
all: bool,
},
Metadata {
urn: String,
#[arg(long)]
region: Option<String>,
#[arg(short, long, default_value = "table")]
output: String,
},
Tree {
urn: String,
guid: String,
#[arg(long)]
region: Option<String>,
#[arg(short, long, default_value = "table")]
output: String,
},
Properties {
urn: String,
guid: String,
#[arg(long = "object-id")]
object_id: Option<i64>,
#[arg(long)]
region: Option<String>,
#[arg(short, long, default_value = "table")]
output: String,
},
#[command(name = "query-properties")]
QueryProperties {
urn: String,
guid: String,
#[arg(short, long)]
filter: String,
#[arg(long)]
fields: Option<String>,
#[arg(long)]
region: Option<String>,
#[arg(short, long, default_value = "table")]
output: String,
},
#[command(subcommand)]
Preset(PresetCommands),
}
#[derive(Debug, Subcommand)]
pub enum PresetCommands {
List,
Show {
name: String,
},
Create {
name: String,
#[arg(short, long)]
format: String,
#[arg(short, long)]
description: Option<String>,
},
Delete {
name: String,
},
Use {
urn: String,
preset: String,
},
}
impl TranslateCommands {
pub async fn execute(
self,
client: &DerivativeClient,
output_format: OutputFormat,
) -> Result<()> {
match self {
TranslateCommands::Start {
urn,
format,
root_filename,
wait,
region,
force,
} => {
translations::start_translation(
client,
urn,
format,
root_filename,
wait,
output_format,
region,
force,
)
.await
}
TranslateCommands::Status { urn, wait } => {
translations::check_status(client, &urn, wait, output_format).await
}
TranslateCommands::Manifest { urn } => {
translations::show_manifest(client, &urn, output_format).await
}
TranslateCommands::Derivatives { urn, format } => {
translations::list_derivatives(client, &urn, format, output_format).await
}
TranslateCommands::Download {
urn,
format,
guid,
out_dir,
all,
} => {
translations::download_derivatives(
client,
&urn,
format,
guid,
out_dir,
all,
output_format,
)
.await
}
TranslateCommands::Metadata {
urn,
region,
output,
} => metadata::show_metadata(client, &urn, region, &output).await,
TranslateCommands::Tree {
urn,
guid,
region,
output,
} => metadata::show_object_tree(client, &urn, &guid, region, &output).await,
TranslateCommands::Properties {
urn,
guid,
object_id,
region,
output,
} => metadata::show_properties(client, &urn, &guid, object_id, region, &output).await,
TranslateCommands::QueryProperties {
urn,
guid,
filter,
fields,
region,
output,
} => {
metadata::query_properties(client, &urn, &guid, &filter, fields, region, &output)
.await
}
TranslateCommands::Preset(cmd) => cmd.execute(client, output_format).await,
}
}
}
impl PresetCommands {
pub async fn execute(
self,
client: &DerivativeClient,
output_format: OutputFormat,
) -> Result<()> {
match self {
PresetCommands::List => presets::list_presets(output_format),
PresetCommands::Show { name } => presets::show_preset(&name, output_format),
PresetCommands::Create {
name,
format,
description,
} => presets::create_preset(&name, &format, description, output_format),
PresetCommands::Delete { name } => presets::delete_preset(&name, output_format),
PresetCommands::Use { urn, preset } => {
presets::use_preset(client, &urn, &preset, output_format).await
}
}
}
}
#[cfg(test)]
mod tests {
use super::translations::TRANSLATE_POLL_TIMEOUT;
use std::time::Duration;
#[test]
fn test_translate_poll_timeout_is_two_hours() {
assert_eq!(TRANSLATE_POLL_TIMEOUT, Duration::from_secs(7200));
assert_eq!(TRANSLATE_POLL_TIMEOUT.as_secs() / 3600, 2);
}
}