blob: b87404a1b022690085b8f70511bea425e2073bb6 [file]
// Licensed to the Apache Software Foundation (ASF) under one
// or more contributor license agreements. See the NOTICE file
// distributed with this work for additional information
// regarding copyright ownership. The ASF licenses this file
// to you under the Apache License, Version 2.0 (the
// "License"); you may not use this file except in compliance
// with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
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 {
/// List all contexts
///
/// Examples
/// iggy context list
#[clap(verbatim_doc_comment, visible_alias = "l")]
List(ContextListArgs),
/// Set the active context
///
/// Examples
/// iggy context use dev
/// iggy context use default
#[clap(verbatim_doc_comment, visible_alias = "u")]
Use(ContextUseArgs),
/// Create a new context
///
/// Creates a new named context in the contexts configuration file.
/// After creating a context, use 'iggy context use <name>' to activate it.
///
/// Examples
/// iggy context create production --transport tcp --tcp-server-address 10.0.0.1:8090
/// iggy context create dev --transport http --http-api-url http://localhost:3000
/// iggy context create local --username iggy --password iggy
#[clap(verbatim_doc_comment, visible_alias = "c")]
Create(ContextCreateArgs),
/// Delete an existing context
///
/// Removes a named context from the contexts configuration file.
/// The 'default' context cannot be deleted. If the deleted context
/// was the active context, the active context resets to 'default'.
///
/// Examples
/// iggy context delete production
#[clap(verbatim_doc_comment, visible_alias = "d")]
Delete(ContextDeleteArgs),
/// Show details of a specific context
///
/// Displays the full configuration of a named context including
/// transport, server addresses, TLS settings, and credentials.
///
/// Examples
/// iggy context show default
/// iggy context show production
#[clap(verbatim_doc_comment, visible_alias = "s")]
Show(ContextShowArgs),
}
#[derive(Debug, Clone, Args)]
pub(crate) struct ContextListArgs {
/// List mode (table or list)
#[clap(short, long, value_enum, default_value_t = ListMode::Table)]
pub(crate) list_mode: ListMode,
}
#[derive(Debug, Clone, Args)]
pub(crate) struct ContextUseArgs {
/// Name of the context to use
#[arg(value_parser = clap::value_parser!(String))]
pub(crate) context_name: String,
}
#[derive(Debug, Clone, Args)]
pub(crate) struct ContextCreateArgs {
/// Name of the context to create
#[arg(value_parser = clap::value_parser!(String))]
pub(crate) context_name: String,
/// The transport to use
///
/// Valid values are "quic", "http", "tcp" and "ws".
#[clap(verbatim_doc_comment, long)]
pub(crate) transport: Option<String>,
/// The server address for the TCP transport
#[clap(long)]
pub(crate) tcp_server_address: Option<String>,
/// The API URL for the HTTP transport
#[clap(long)]
pub(crate) http_api_url: Option<String>,
/// The server address for the QUIC transport
#[clap(long)]
pub(crate) quic_server_address: Option<String>,
/// Flag to enable TLS for the TCP transport
#[clap(long)]
pub(crate) tcp_tls_enabled: Option<bool>,
/// Iggy server username
#[clap(short, long)]
pub(crate) username: Option<String>,
/// Iggy server password
#[clap(short, long)]
pub(crate) password: Option<String>,
/// Iggy server personal access token
#[clap(short, long)]
pub(crate) token: Option<String>,
/// Iggy server personal access token name
#[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 {
/// Name of the context to delete
#[arg(value_parser = clap::value_parser!(String))]
pub(crate) context_name: String,
}
#[derive(Debug, Clone, Args)]
pub(crate) struct ContextShowArgs {
/// Name of the context to show
#[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());
}
}