use clap::Parser;
use std::collections::HashMap;
use std::net::{IpAddr, Ipv4Addr};
use std::path::PathBuf;
use ipnetwork::IpNetwork;
#[derive(Parser, Debug, Clone)]
pub struct RunParameters {
#[clap(env)]
pub test_plan: String, #[clap(env)]
pub test_case: String, #[clap(env)]
pub test_run: String,
#[clap(env)]
pub test_repo: String, #[clap(env)]
pub test_branch: String, #[clap(env)]
pub test_tag: String,
#[clap(env)]
pub test_outputs_path: PathBuf, #[clap(env)]
pub test_temp_path: String,
#[clap(env)]
pub test_instance_count: u64, #[clap(env)]
pub test_instance_role: String, #[clap(env, parse(try_from_str = parse_key_val))]
pub test_instance_params: HashMap<String, String>,
#[clap(long, env)]
pub test_sidecar: bool,
#[clap(env)]
pub test_subnet: IpNetwork, #[clap(env)]
pub test_start_time: String,
#[clap(env)]
pub test_capture_profiles: String,
#[clap(env)]
pub test_group_instance_count: u64, #[clap(env)]
pub test_group_id: String,
#[clap(long, env)]
pub test_disable_metrics: bool,
#[clap(env)]
pub hostname: String, #[clap(env)]
pub influxdb_url: String, #[clap(env)]
pub redis_host: String, }
impl RunParameters {
pub fn data_network_ip(&self) -> std::io::Result<Option<IpAddr>> {
if !self.test_sidecar {
return Ok(Some(IpAddr::V4(Ipv4Addr::new(127, 0, 0, 1))));
}
Ok(if_addrs::get_if_addrs()?
.into_iter()
.map(|i| i.addr.ip())
.find(|ip| self.test_subnet.contains(*ip)))
}
}
fn parse_key_val(s: &str) -> Result<HashMap<String, String>, String> {
let mut hashmap = HashMap::new();
for kv in s.split('|').filter(|&s| !s.is_empty()) {
let pos = kv
.find('=')
.ok_or_else(|| format!("Invalid KEY=VALUE: no '=' found in {}", kv))?;
hashmap.insert(String::from(&kv[..pos]), String::from(&kv[pos + 1..]));
}
Ok(hashmap)
}
#[test]
fn test_parse_key_val() {
let result = parse_key_val("feature=false|neutral_nodes=10|num=2|word=never").unwrap();
assert_eq!(4, result.len());
assert_eq!("false", result.get("feature").unwrap());
assert_eq!("10", result.get("neutral_nodes").unwrap());
assert_eq!("2", result.get("num").unwrap());
assert_eq!("never", result.get("word").unwrap());
let result = parse_key_val("feature=false").unwrap();
assert_eq!(1, result.len());
assert_eq!("false", result.get("feature").unwrap());
let result = parse_key_val("word=ne=ver").unwrap();
assert_eq!(1, result.len());
assert_eq!("ne=ver", result.get("word").unwrap());
let result = parse_key_val("").unwrap();
assert!(result.is_empty());
let result = parse_key_val("feature=false|neutral_nodes");
assert!(result.is_err());
}