use crate::{
clipboard::ClipboardManager,
database::Database,
error::Result,
template::TemplateEngine,
utils,
};
use std::collections::HashMap;
use std::io::{self, Write};
pub struct GetCommand;
impl GetCommand {
pub fn execute(
database: &Database,
clipboard: &mut ClipboardManager,
name: String,
variables: Vec<(String, String)>,
copy: bool,
raw: bool,
) -> Result<()> {
let prompt = database.get_prompt(&name)?;
if raw {
println!("{}", prompt.content);
if copy && clipboard.is_available() {
clipboard.set_text(&prompt.content)?;
utils::print_info("Copied raw content to clipboard");
}
return Ok(());
}
let mut variable_map: HashMap<String, String> = variables.into_iter().collect();
for var in &prompt.variables {
if !variable_map.contains_key(&var.name) {
if let Some(ref default) = var.default_value {
variable_map.insert(var.name.clone(), default.clone());
}
}
}
let mut template_engine = TemplateEngine::new();
let missing = template_engine.get_missing_variables(&prompt.content, &variable_map)?;
if !missing.is_empty() {
for var_name in missing {
let description = prompt.variables
.iter()
.find(|v| v.name == var_name)
.and_then(|v| v.description.as_ref());
if let Some(desc) = description {
print!("Enter value for '{}' ({}): ", var_name, desc);
} else {
print!("Enter value for '{}': ", var_name);
}
io::stdout().flush()?;
let mut value = String::new();
io::stdin().read_line(&mut value)?;
variable_map.insert(var_name, value.trim().to_string());
}
}
let rendered = template_engine.render(&prompt.content, &variable_map)?;
println!("{}", rendered);
if copy && clipboard.is_available() {
clipboard.set_text(&rendered)?;
utils::print_info("Copied rendered prompt to clipboard");
}
Ok(())
}
}