use anyhow::{Context, Result};
use super::config::get_max_jump_hosts;
use super::host::JumpHost;
use super::host_parser::parse_single_jump_host;
pub fn parse_jump_hosts(jump_spec: &str) -> Result<Vec<JumpHost>> {
if jump_spec.trim().is_empty() {
return Ok(Vec::new());
}
let mut jump_hosts = Vec::new();
for host_spec in jump_spec.split(',') {
let host_spec = host_spec.trim();
if host_spec.is_empty() {
continue;
}
let jump_host = parse_single_jump_host(host_spec)
.with_context(|| format!("Failed to parse jump host specification: '{host_spec}'"))?;
jump_hosts.push(jump_host);
}
if jump_hosts.is_empty() {
anyhow::bail!("No valid jump hosts found in specification: '{jump_spec}'");
}
let max_jump_hosts = get_max_jump_hosts();
if jump_hosts.len() > max_jump_hosts {
anyhow::bail!(
"Too many jump hosts specified: {} (maximum allowed: {}). Reduce the number of jump hosts in your chain or set BSSH_MAX_JUMP_HOSTS environment variable.",
jump_hosts.len(),
max_jump_hosts
);
}
Ok(jump_hosts)
}