use anyhow::Result;
use clap::Args;
use std::path::PathBuf;
use warg_client::keyring::Keyring;
use warg_client::storage::RegistryDomain;
use warg_client::{ClientError, Config, FileSystemClient, StorageLockResult};
use warg_crypto::signing::PrivateKey;
mod bundle;
mod clear;
mod config;
mod dependencies;
mod download;
mod info;
mod key;
mod lock;
mod login;
mod logout;
mod publish;
mod reset;
mod update;
pub use self::bundle::*;
pub use self::clear::*;
pub use self::config::*;
pub use self::dependencies::*;
pub use self::download::*;
pub use self::info::*;
pub use self::key::*;
pub use self::lock::*;
pub use self::login::*;
pub use self::logout::*;
pub use self::publish::*;
pub use self::reset::*;
pub use self::update::*;
#[derive(Args)]
pub struct CommonOptions {
#[clap(long, value_name = "URL")]
pub registry: Option<String>,
#[clap(long, value_name = "CONFIG")]
pub config: Option<PathBuf>,
}
impl CommonOptions {
pub fn read_config(&self) -> Result<Config> {
Ok(self
.config
.as_ref()
.map_or_else(Config::from_default_file, |p| {
Config::from_file(p).map(Some)
})?
.unwrap_or_default())
}
pub async fn create_client(&self, config: &Config) -> Result<FileSystemClient, ClientError> {
let client =
match FileSystemClient::try_new_with_config(self.registry.as_deref(), config, None)
.await?
{
StorageLockResult::Acquired(client) => Ok(client),
StorageLockResult::NotAcquired(path) => {
println!(
"blocking on lock for directory `{path}`...",
path = path.display()
);
FileSystemClient::new_with_config(self.registry.as_deref(), config, None).await
}
}?;
Ok(client)
}
pub async fn signing_key(
&self,
registry_domain: Option<&RegistryDomain>,
) -> Result<PrivateKey> {
let config = self.read_config()?;
let key = Keyring::from_config(&config)?.get_signing_key(
registry_domain.map(|domain| domain.to_string()).as_deref(),
&config.keys,
config.home_url.as_deref(),
)?;
Ok(key)
}
}