use crate::compsys::ported::_normal::_normal;
use crate::ported::hist::bufferwords;
use crate::ported::params::{getaparam, getsparam, setaparam, setsparam};
use std::process::Command;
fn compute_end_offset(nwords: usize, current: i64) -> i64 {
nwords as i64 - current
}
fn rebuild_words(handler_output: &str) -> Vec<String> {
bufferwords(handler_output, 0).0
}
fn recompute_current(nwords: usize, end_offset: i64) -> i64 {
nwords as i64 - end_offset
}
fn run_handler_l(rest: &[String]) -> String {
match Command::new("zsh-mime-handler")
.arg("-l")
.args(rest)
.output()
{
Ok(o) => String::from_utf8_lossy(&o.stdout).to_string(),
Err(_) => String::new(),
}
}
pub fn _zsh_mime_handler(_args: &[String]) -> i32 {
let words = getaparam("words").unwrap_or_default();
let current: i64 = getsparam("CURRENT")
.and_then(|s| s.parse().ok())
.unwrap_or(0);
let end_offset = compute_end_offset(words.len(), current);
let rest: Vec<String> = if words.len() > 1 {
words[1..].to_vec()
} else {
Vec::new()
};
let output = run_handler_l(&rest);
let new_words = rebuild_words(&output);
let new_current = recompute_current(new_words.len(), end_offset);
setaparam("words", new_words);
let _ = setsparam("CURRENT", &new_current.to_string());
_normal(&[])
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn end_offset_is_distance_from_end() {
assert_eq!(compute_end_offset(3, 2), 1);
assert_eq!(compute_end_offset(3, 3), 0);
}
#[test]
fn recompute_current_inverts_end_offset() {
assert_eq!(recompute_current(2, 1), 1);
let n = 4usize;
let off = compute_end_offset(n, 3);
assert_eq!(recompute_current(n, off), 3);
}
#[test]
fn rebuild_words_splits_and_unquotes() {
let out = "open '/tmp/my file.pdf'";
assert_eq!(
rebuild_words(out),
vec!["open".to_string(), "/tmp/my file.pdf".to_string()]
);
}
#[test]
fn rebuild_words_plain_line() {
assert_eq!(
rebuild_words("xpdf report.pdf"),
vec!["xpdf".to_string(), "report.pdf".to_string()]
);
}
#[test]
fn rebuild_words_empty_output() {
assert!(rebuild_words("").is_empty());
}
#[test]
fn drop_first_word_selects_the_arguments() {
let words = vec![
"zsh-mime-handler".to_string(),
"a".to_string(),
"b".to_string(),
];
let rest: Vec<String> = words[1..].to_vec();
assert_eq!(rest, vec!["a".to_string(), "b".to_string()]);
}
}