use tokio::process::Command; pub async fn print_versions() -> Result<(), Box> { eprintln!("Using emacs version: {}", get_emacs_version().await?.trim()); eprintln!( "Using org-mode version: {}", get_org_mode_version().await?.trim() ); Ok(()) } pub(crate) async fn get_emacs_version() -> Result> { let elisp_script = r#"(progn (message "%s" (version)) )"#; let mut cmd = Command::new("emacs"); let cmd = cmd .arg("-q") .arg("--no-site-file") .arg("--no-splash") .arg("--batch") .arg("--eval") .arg(elisp_script); let out = cmd.output().await?; out.status.exit_ok()?; Ok(String::from_utf8(out.stderr)?) } pub(crate) async fn get_org_mode_version() -> Result> { let elisp_script = r#"(progn (org-mode) (message "%s" (org-version nil t nil)) )"#; let mut cmd = Command::new("emacs"); let cmd = cmd .arg("-q") .arg("--no-site-file") .arg("--no-splash") .arg("--batch") .arg("--eval") .arg(elisp_script); let out = cmd.output().await?; out.status.exit_ok()?; Ok(String::from_utf8(out.stderr)?) }