use crate::args::common::ListMode;
use clap::{Args, Subcommand};
use iggy_cli::commands::binary_context::common::ContextConfig;
use iggy_common::ArgsOptional;
#[derive(Debug, Clone, Subcommand)]
pub(crate) enum ContextAction {
#[clap(verbatim_doc_comment, visible_alias = "l")]
List(ContextListArgs),
#[clap(verbatim_doc_comment, visible_alias = "u")]
Use(ContextUseArgs),
#[clap(verbatim_doc_comment, visible_alias = "c")]
Create(ContextCreateArgs),
#[clap(verbatim_doc_comment, visible_alias = "d")]
Delete(ContextDeleteArgs),
}
#[derive(Debug, Clone, Args)]
pub(crate) struct ContextListArgs {
#[clap(short, long, value_enum, default_value_t = ListMode::Table)]
pub(crate) list_mode: ListMode,
}
#[derive(Debug, Clone, Args)]
pub(crate) struct ContextUseArgs {
#[arg(value_parser = clap::value_parser!(String))]
pub(crate) context_name: String,
}
#[derive(Debug, Clone, Args)]
pub(crate) struct ContextCreateArgs {
#[arg(value_parser = clap::value_parser!(String))]
pub(crate) context_name: String,
#[clap(verbatim_doc_comment, long)]
pub(crate) transport: Option<String>,
#[clap(long)]
pub(crate) tcp_server_address: Option<String>,
#[clap(long)]
pub(crate) http_api_url: Option<String>,
#[clap(long)]
pub(crate) quic_server_address: Option<String>,
#[clap(long)]
pub(crate) tcp_tls_enabled: Option<bool>,
#[clap(short, long)]
pub(crate) username: Option<String>,
#[clap(short, long)]
pub(crate) password: Option<String>,
#[clap(short, long)]
pub(crate) token: Option<String>,
#[clap(short = 'n', long)]
pub(crate) token_name: Option<String>,
}
impl From<ContextCreateArgs> for ContextConfig {
fn from(args: ContextCreateArgs) -> Self {
ContextConfig {
username: args.username,
password: args.password,
token: args.token,
token_name: args.token_name,
iggy: ArgsOptional {
transport: args.transport,
tcp_server_address: args.tcp_server_address,
http_api_url: args.http_api_url,
quic_server_address: args.quic_server_address,
tcp_tls_enabled: args.tcp_tls_enabled,
..Default::default()
},
extra: Default::default(),
}
}
}
#[derive(Debug, Clone, Args)]
pub(crate) struct ContextDeleteArgs {
#[arg(value_parser = clap::value_parser!(String))]
pub(crate) context_name: String,
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn should_convert_create_args_to_context_config() {
let args = ContextCreateArgs {
context_name: "production".to_string(),
transport: Some("tcp".to_string()),
tcp_server_address: Some("10.0.0.1:8090".to_string()),
http_api_url: None,
quic_server_address: None,
tcp_tls_enabled: Some(true),
username: Some("admin".to_string()),
password: Some("secret".to_string()),
token: Some("tok123".to_string()),
token_name: Some("my-token".to_string()),
};
let config: ContextConfig = args.into();
assert_eq!(config.username.as_deref(), Some("admin"));
assert_eq!(config.password.as_deref(), Some("secret"));
assert_eq!(config.token.as_deref(), Some("tok123"));
assert_eq!(config.token_name.as_deref(), Some("my-token"));
assert_eq!(config.iggy.transport.as_deref(), Some("tcp"));
assert_eq!(
config.iggy.tcp_server_address.as_deref(),
Some("10.0.0.1:8090")
);
assert!(config.iggy.http_api_url.is_none());
assert!(config.iggy.quic_server_address.is_none());
assert_eq!(config.iggy.tcp_tls_enabled, Some(true));
}
#[test]
fn should_convert_create_args_with_defaults() {
let args = ContextCreateArgs {
context_name: "minimal".to_string(),
transport: None,
tcp_server_address: None,
http_api_url: None,
quic_server_address: None,
tcp_tls_enabled: None,
username: None,
password: None,
token: None,
token_name: None,
};
let config: ContextConfig = args.into();
assert!(config.username.is_none());
assert!(config.password.is_none());
assert!(config.token.is_none());
assert!(config.token_name.is_none());
assert!(config.iggy.transport.is_none());
}
}