use anyhow::{Context, Result}; use std::fs; use std::path::Path; /// Open editor for user to input/edit content pub fn edit_content(initial_content: &str) -> Result { edit::edit(initial_content).context("Failed to open editor") } /// Edit file in user's default editor pub fn edit_file(path: &Path) -> Result { let content = fs::read_to_string(path) .unwrap_or_default(); let edited = edit::edit(&content) .context("Failed to open editor")?; fs::write(path, &edited) .with_context(|| format!("Failed to write file: {:?}", path))?; Ok(edited) } /// Create temporary file and open in editor pub fn edit_temp(initial_content: &str, extension: &str) -> Result { let temp_file = tempfile::Builder::new() .suffix(&format!(".{}", extension)) .tempfile() .context("Failed to create temp file")?; let path = temp_file.path(); fs::write(path, initial_content) .context("Failed to write temp file")?; edit_file(path) } /// Get editor command from environment pub fn get_editor() -> String { std::env::var("EDITOR") .or_else(|_| std::env::var("VISUAL")) .unwrap_or_else(|_| { if cfg!(target_os = "windows") { if let Ok(code) = which::which("code") { return "code --wait".to_string(); } if let Ok(notepad) = which::which("notepad") { return "notepad".to_string(); } "notepad".to_string() } else if cfg!(target_os = "macos") { if which::which("code").is_ok() { return "code --wait".to_string(); } "vi".to_string() } else { if which::which("nano").is_ok() { return "nano".to_string(); } "vi".to_string() } }) } /// Check if editor is available pub fn check_editor() -> Result<()> { let editor = get_editor(); which::which(&editor) .with_context(|| format!("Editor '{}' not found in PATH", editor))?; Ok(()) }