1use anyhow::{bail, Result};
2use std::path::Path;
3
4pub fn resolve() -> String {
5 std::env::var("VISUAL")
6 .ok()
7 .filter(|e| !e.is_empty())
8 .or_else(|| std::env::var("EDITOR").ok().filter(|e| !e.is_empty()))
9 .unwrap_or_else(|| "vi".to_string())
10}
11
12pub fn open(path: &Path) -> Result<()> {
13 let editor = resolve();
14 let mut parts = editor.split_whitespace();
15 let bin = parts.next().unwrap();
16 let status = std::process::Command::new(bin)
17 .args(parts)
18 .arg(path)
19 .stdin(std::process::Stdio::inherit())
20 .stdout(std::process::Stdio::inherit())
21 .stderr(std::process::Stdio::inherit())
22 .status()
23 .map_err(|e| anyhow::anyhow!("could not launch editor '{editor}': {e}"))?;
24
25 if !status.success() {
26 bail!("editor exited with non-zero status");
27 }
28 Ok(())
29}