#[macro_export]
macro_rules! dmenu {
(__@internal_start@__ $(args $($arg:expr)+)?) => {{
let mut dmenu = ::std::process::Command::new("dmenu")
$(.args([$($arg),+]))?
.stdin(::std::process::Stdio::piped())
.stdout(::std::process::Stdio::piped())
.spawn()
.unwrap();
(
dmenu.stdin.take().unwrap(),
dmenu.stdout.take().unwrap()
)
}};
(__@internal_end@__ $stdin:expr, $stdout:expr) => {{
drop($stdin);
let mut buf = String::new();
::std::io::Read::read_to_string(&mut $stdout, &mut buf).unwrap();
buf.trim().to_string()
}};
(iter $e:expr $(;args $($arg:expr),+)?) => {{
let (mut stdin, mut stdout) = dmenu!(__@internal_start@__ $(args $($arg)+)?);
for x in $e {
::std::io::Write::write_all(&mut stdin, x.as_bytes()).unwrap();
::std::io::Write::write_all(&mut stdin, b"\n").unwrap();
}
dmenu!(__@internal_end@__ stdin, stdout)
}};
(stringify $($e:expr),* $(;args $($arg:expr),+)?) => {{
let (mut stdin, mut stdout) = dmenu!(__@internal_start@__ $(args $($arg)+)?);
$(
::std::io::Write::write_all(&mut stdin, stringify!($e).as_bytes()).unwrap();
::std::io::Write::write_all(&mut stdin, b"\n").unwrap();
)*
dmenu!(__@internal_end@__ stdin, stdout)
}};
(args $($arg:expr),+) => {{
let (mut stdin, mut stdout) = dmenu!(__@internal_start@__ args $($arg)+);
dmenu!(__@internal_end@__ stdin, stdout)
}};
(prompt $text:expr $(;args $($arg:expr),+)?) => {{
let (mut stdin, mut stdout) = dmenu!(__@internal_start@__ args "-p" $text $($arg)*);
dmenu!(__@internal_end@__ stdin, stdout)
}};
($($e:expr),* $(;args $($arg:expr),+)?) => {{
let (mut stdin, mut stdout) = dmenu!(__@internal_start@__ $(args $($arg)+)?);
$(
::std::io::Write::write_all(&mut stdin, $e.as_bytes()).unwrap();
::std::io::Write::write_all(&mut stdin, b"\n").unwrap();
)*
dmenu!(__@internal_end@__ stdin, stdout)
}};
}