1use anyhow::Result;
4use clap::Args;
5use std::path::PathBuf;
6use warg_client::keyring::Keyring;
7use warg_client::storage::RegistryDomain;
8use warg_client::{ClientError, Config, FileSystemClient, StorageLockResult};
9use warg_crypto::signing::PrivateKey;
10
11mod bundle;
12mod clear;
13mod config;
14mod dependencies;
15mod download;
16mod info;
17mod key;
18mod lock;
19mod login;
20mod logout;
21mod publish;
22mod reset;
23mod update;
24
25pub use self::bundle::*;
26pub use self::clear::*;
27pub use self::config::*;
28pub use self::dependencies::*;
29pub use self::download::*;
30pub use self::info::*;
31pub use self::key::*;
32pub use self::lock::*;
33pub use self::login::*;
34pub use self::logout::*;
35pub use self::publish::*;
36pub use self::reset::*;
37pub use self::update::*;
38
39#[derive(Args)]
41pub struct CommonOptions {
42 #[clap(long, value_name = "URL")]
44 pub registry: Option<String>,
45 #[clap(long, value_name = "CONFIG")]
51 pub config: Option<PathBuf>,
52}
53
54impl CommonOptions {
55 pub fn read_config(&self) -> Result<Config> {
59 Ok(self
60 .config
61 .as_ref()
62 .map_or_else(Config::from_default_file, |p| {
63 Config::from_file(p).map(Some)
64 })?
65 .unwrap_or_default())
66 }
67
68 pub async fn create_client(&self, config: &Config) -> Result<FileSystemClient, ClientError> {
70 let client =
71 match FileSystemClient::try_new_with_config(self.registry.as_deref(), config, None)
72 .await?
73 {
74 StorageLockResult::Acquired(client) => Ok(client),
75 StorageLockResult::NotAcquired(path) => {
76 println!(
77 "blocking on lock for directory `{path}`...",
78 path = path.display()
79 );
80
81 FileSystemClient::new_with_config(self.registry.as_deref(), config, None).await
82 }
83 }?;
84 Ok(client)
85 }
86
87 pub async fn signing_key(
89 &self,
90 registry_domain: Option<&RegistryDomain>,
91 ) -> Result<PrivateKey> {
92 let config = self.read_config()?;
93 let key = Keyring::from_config(&config)?.get_signing_key(
94 registry_domain.map(|domain| domain.to_string()).as_deref(),
95 &config.keys,
96 config.home_url.as_deref(),
97 )?;
98 Ok(key)
99 }
100}