pub mod storage;
use std::io::IsTerminal;
use std::sync::Arc;
use std::time::Duration;
use anyhow::Result;
use auths_core::config::EnvironmentConfig;
use auths_core::signing::{CachedPassphraseProvider, PassphraseProvider};
use auths_sdk::ports::agent::AgentSigningPort;
use crate::cli::AuthsCli;
use crate::config::{CliConfig, OutputFormat};
use crate::core::provider::{CliPassphraseProvider, PrefilledPassphraseProvider};
pub fn build_config(cli: &AuthsCli) -> Result<CliConfig> {
let is_json = cli.json || matches!(cli.format, OutputFormat::Json);
let output_format = if is_json {
OutputFormat::Json
} else {
cli.format
};
let env_config = EnvironmentConfig::from_env();
let passphrase_provider: Arc<dyn PassphraseProvider + Send + Sync> =
if let Some(passphrase) = env_config.keychain.passphrase.clone() {
Arc::new(PrefilledPassphraseProvider::new(zeroize::Zeroizing::new(
passphrase,
)))
} else {
let inner = Arc::new(CliPassphraseProvider::new());
Arc::new(CachedPassphraseProvider::new(
inner,
Duration::from_secs(3600),
))
};
let is_interactive = std::io::stdout().is_terminal();
Ok(CliConfig {
repo_path: cli.repo.clone(),
output_format,
is_interactive,
passphrase_provider,
env_config,
})
}
pub fn build_agent_provider() -> Arc<dyn AgentSigningPort + Send + Sync> {
#[cfg(unix)]
{
Arc::new(crate::adapters::agent::CliAgentAdapter)
}
#[cfg(not(unix))]
{
Arc::new(auths_sdk::ports::agent::NoopAgentProvider)
}
}