use crate::commands;
use clap::{Parser, Subcommand};
const LONG_ABOUT: &str = "\
CLI for building with Turnkey Verifiable Cloud.
Some commands accept multiple configuration input types.
Configuration values are resolved in this order, highest priority first:
1. Command-line flag (e.g. --app-id)
2. Environment variable (e.g. TVC_APP_ID)
3. Config file value (--config-file)
4. Built-in default
Special rules:
--pivot-args replaces the config file's list entirely (does not append)
Authentication:
Local: run `tvc login` once; commands then read ~/.config/turnkey/.
CI: set TVC_ORG_ID, TVC_API_KEY_PUBLIC, and TVC_API_KEY_PRIVATE
to authenticate without files. Env vars take precedence over local
config files. Setting some but not all three required vars will error.";
#[derive(Debug, Parser)]
#[command(about = "CLI for building with Turnkey Verifiable Cloud", long_about = LONG_ABOUT)]
pub struct Cli {
#[command(subcommand)]
command: Commands,
}
impl Cli {
pub async fn run() -> anyhow::Result<()> {
let args = Cli::parse();
match args.command {
Commands::Deploy { command } => match command {
DeployCommands::Approve(args) => commands::deploy::approve::run(args).await,
DeployCommands::GetStatus(args) => commands::deploy::get_status::run(args).await,
DeployCommands::ProvisioningDetails(args) => {
commands::deploy::provisioning_details::run(args).await
}
DeployCommands::Status(args) => commands::deploy::status::run(args).await,
DeployCommands::Create(args) => commands::deploy::create::run(args).await,
DeployCommands::Init(args) => commands::deploy::init::run(args).await,
DeployCommands::Delete(args) => commands::deploy::delete::run(args).await,
DeployCommands::Restore(args) => commands::deploy::restore::run(args).await,
},
Commands::App { command } => match command {
AppCommands::Status(args) => commands::app::status::run(args).await,
AppCommands::List(args) => commands::app::list::run(args).await,
AppCommands::Create(args) => commands::app::create::run(args).await,
AppCommands::Init(args) => commands::app::init::run(args).await,
AppCommands::SetLiveDeploy(args) => commands::app::set_live_deploy::run(args).await,
AppCommands::Delete(args) => commands::app::delete::run(args).await,
},
Commands::Keys { command } => match command {
KeysCommands::GenerateQuorumKey(args) => {
commands::keys::generate_quorum_key::run(args).await
}
KeysCommands::InitQuorumKey(args) => {
commands::keys::init_quorum_key::run(args).await
}
KeysCommands::ReEncryptShare(args) => {
commands::keys::re_encrypt_share::run(args).await
}
},
Commands::Login(args) => commands::login::run(args).await,
}
}
}
#[derive(Debug, Subcommand)]
enum Commands {
Login(commands::login::Args),
Deploy {
#[command(subcommand)]
command: DeployCommands,
},
App {
#[command(subcommand)]
command: AppCommands,
},
Keys {
#[command(subcommand)]
command: KeysCommands,
},
}
#[derive(Debug, Subcommand)]
enum DeployCommands {
Approve(commands::deploy::approve::Args),
GetStatus(commands::deploy::get_status::Args),
ProvisioningDetails(commands::deploy::provisioning_details::Args),
Status(commands::deploy::status::Args),
#[command(long_about = commands::deploy::create::LONG_ABOUT)]
Create(commands::deploy::create::Args),
Init(commands::deploy::init::Args),
Delete(commands::deploy::delete::Args),
Restore(commands::deploy::restore::Args),
}
#[derive(Debug, Subcommand)]
enum AppCommands {
Status(commands::app::status::Args),
List(commands::app::list::Args),
Create(commands::app::create::Args),
Init(commands::app::init::Args),
SetLiveDeploy(commands::app::set_live_deploy::Args),
Delete(commands::app::delete::Args),
}
#[derive(Debug, Subcommand)]
enum KeysCommands {
GenerateQuorumKey(commands::keys::generate_quorum_key::Args),
InitQuorumKey(commands::keys::init_quorum_key::Args),
ReEncryptShare(commands::keys::re_encrypt_share::Args),
}