1#[macro_export]
2macro_rules! dmenu {
72 (__@internal_start@__ $(args $($arg:expr)+)?) => {{
73 let mut dmenu = ::std::process::Command::new("dmenu")
74 $(.args([$($arg),+]))?
75 .stdin(::std::process::Stdio::piped())
76 .stdout(::std::process::Stdio::piped())
77 .spawn()
78 .unwrap();
79
80 (
81 dmenu.stdin.take().unwrap(),
82 dmenu.stdout.take().unwrap()
83 )
84 }};
85
86 (__@internal_end@__ $stdin:expr, $stdout:expr) => {{
87 drop($stdin);
88
89 let mut buf = String::new();
90 ::std::io::Read::read_to_string(&mut $stdout, &mut buf).unwrap();
91 buf.trim().to_string()
92 }};
93
94 (iter $e:expr $(;args $($arg:expr),+)?) => {{
95 let (mut stdin, mut stdout) = dmenu!(__@internal_start@__ $(args $($arg)+)?);
96
97 for x in $e {
98 ::std::io::Write::write_all(&mut stdin, x.as_bytes()).unwrap();
99 ::std::io::Write::write_all(&mut stdin, b"\n").unwrap();
100 }
101
102 dmenu!(__@internal_end@__ stdin, stdout)
103 }};
104
105 (stringify $($e:expr),* $(;args $($arg:expr),+)?) => {{
106 let (mut stdin, mut stdout) = dmenu!(__@internal_start@__ $(args $($arg)+)?);
107
108 $(
109 ::std::io::Write::write_all(&mut stdin, stringify!($e).as_bytes()).unwrap();
110 ::std::io::Write::write_all(&mut stdin, b"\n").unwrap();
111 )*
112
113 dmenu!(__@internal_end@__ stdin, stdout)
114
115 }};
117
118 (args $($arg:expr),+) => {{
119 let (mut stdin, mut stdout) = dmenu!(__@internal_start@__ args $($arg)+);
120
121 dmenu!(__@internal_end@__ stdin, stdout)
122 }};
123
124 (prompt $text:expr $(;args $($arg:expr),+)?) => {{
125 let (mut stdin, mut stdout) = dmenu!(__@internal_start@__ args "-p" $text $($arg)*);
126
127 dmenu!(__@internal_end@__ stdin, stdout)
128 }};
129
130 ($($e:expr),* $(;args $($arg:expr),+)?) => {{
131 let (mut stdin, mut stdout) = dmenu!(__@internal_start@__ $(args $($arg)+)?);
132
133 $(
134 ::std::io::Write::write_all(&mut stdin, $e.as_bytes()).unwrap();
135 ::std::io::Write::write_all(&mut stdin, b"\n").unwrap();
136 )*
137
138 dmenu!(__@internal_end@__ stdin, stdout)
139 }};
140}