use crate::ported::commands::main::{finish_args, get_argparser, Args};
use crate::ported::scripts::powerline_daemon::parse_client_argv;
use std::collections::HashMap;
use std::io::Write;
pub fn main<F>(args: &[String], render_fn: F) -> i32
where
F: FnOnce(&Args, &HashMap<String, String>, &str) -> Vec<u8>,
{
let parser = get_argparser();
let _ = parser;
let mut parsed = parse_client_argv(args);
if parsed.ext.is_empty() {
eprintln!("powerline-render: --ext is required");
return 2;
}
let environ: HashMap<String, String> = std::env::vars().collect();
let _ = finish_args(&environ, &mut parsed, false);
let cwd = std::env::current_dir()
.map(|p| p.display().to_string())
.unwrap_or_default();
let bytes = render_fn(&parsed, &environ, &cwd);
let _ = std::io::stdout().lock().write_all(&bytes);
0
}
#[cfg(test)]
mod tests {
use super::*;
fn noop_render(_args: &Args, _environ: &HashMap<String, String>, _cwd: &str) -> Vec<u8> {
Vec::new()
}
#[test]
fn main_returns_2_when_ext_missing() {
assert_eq!(main(&[], noop_render), 2);
}
#[test]
fn main_returns_0_when_ext_supplied_positional() {
let r = main(&["shell".to_string()], noop_render);
assert_eq!(r, 0);
}
#[test]
fn main_passes_parsed_args_to_render_fn() {
let captured: std::cell::RefCell<Option<Args>> = std::cell::RefCell::new(None);
let capture = |a: &Args, _e: &HashMap<String, String>, _c: &str| -> Vec<u8> {
*captured.borrow_mut() = Some(a.clone());
Vec::new()
};
let r = main(
&[
"tmux".to_string(),
"left".to_string(),
"-w".to_string(),
"80".to_string(),
],
capture,
);
assert_eq!(r, 0);
let got = captured.borrow().clone().expect("render_fn not called");
assert_eq!(got.ext, vec!["tmux".to_string()]);
assert_eq!(got.side.as_deref(), Some("left"));
assert_eq!(got.width, Some(80));
}
#[test]
fn main_writes_render_fn_bytes_through_to_caller_path() {
let r = main(&["shell".to_string()], |_a, _e, _c| b"hello".to_vec());
assert_eq!(r, 0);
}
}