use std::collections::HashMap;
pub fn interpolate_variables(input: &str, variables: &HashMap<String, String>) -> String {
let mut result = input.to_string();
for (key, value) in variables {
let placeholder = format!("${{{}}}", key);
result = result.replace(&placeholder, value);
}
result
}
pub fn format_cleanup_message(session_name: &str) -> String {
format!(
"ℹ️ Session '{}' has been merged. You can clean it up with: prodigy worktree cleanup {}",
session_name, session_name
)
}
pub fn truncate_for_display(value: &str, max_length: usize) -> String {
if value.len() > max_length {
format!("{}... (truncated)", &value[..max_length])
} else {
value.to_string()
}
}
pub fn format_variables_for_log(variables: &HashMap<String, String>, indent: &str) -> String {
let mut lines = Vec::new();
let mut sorted_vars: Vec<_> = variables.iter().collect();
sorted_vars.sort_by_key(|(k, _)| *k);
for (key, value) in sorted_vars {
let display_value = truncate_for_display(value, 100);
lines.push(format!("{}{} = {}", indent, key, display_value));
}
lines.join("\n")
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_interpolate_variables() {
let mut vars = HashMap::new();
vars.insert("name".to_string(), "test-session".to_string());
vars.insert("branch".to_string(), "main".to_string());
let input = "Merge ${name} to ${branch}";
let result = interpolate_variables(input, &vars);
assert_eq!(result, "Merge test-session to main");
}
#[test]
fn test_interpolate_variables_missing() {
let vars = HashMap::new();
let input = "Merge ${name} to ${branch}";
let result = interpolate_variables(input, &vars);
assert_eq!(result, "Merge ${name} to ${branch}");
}
#[test]
fn test_format_cleanup_message() {
let msg = format_cleanup_message("session-123");
assert!(msg.contains("session-123"));
assert!(msg.contains("prodigy worktree cleanup session-123"));
}
#[test]
fn test_truncate_short_value() {
let value = "short";
assert_eq!(truncate_for_display(value, 100), "short");
}
#[test]
fn test_truncate_long_value() {
let value = "a".repeat(150);
let result = truncate_for_display(&value, 100);
assert!(result.ends_with("... (truncated)"));
assert!(result.len() < 150);
}
#[test]
fn test_format_variables_for_log() {
let mut vars = HashMap::new();
vars.insert("key1".to_string(), "value1".to_string());
vars.insert("key2".to_string(), "value2".to_string());
let formatted = format_variables_for_log(&vars, " ");
assert!(formatted.contains("key1 = value1"));
assert!(formatted.contains("key2 = value2"));
}
}