added example
This commit is contained in:
@@ -102,12 +102,16 @@ async fn main() -> anyhow::Result<()> {
|
|||||||
let mut printer = editor.create_external_printer().ok();
|
let mut printer = editor.create_external_printer().ok();
|
||||||
let prompt = format!("{}> ", args.name);
|
let prompt = format!("{}> ", args.name);
|
||||||
let (line_tx, line_rx) = std_mpsc::sync_channel::<Input>(16);
|
let (line_tx, line_rx) = std_mpsc::sync_channel::<Input>(16);
|
||||||
|
// The reader waits for this ack after every line, so the next prompt is
|
||||||
|
// drawn only after the command's output has been printed — otherwise the
|
||||||
|
// line editor's redraws can visually swallow the output.
|
||||||
|
let (ack_tx, ack_rx) = std_mpsc::channel::<()>();
|
||||||
std::thread::spawn(move || {
|
std::thread::spawn(move || {
|
||||||
loop {
|
loop {
|
||||||
match editor.readline(&prompt) {
|
match editor.readline(&prompt) {
|
||||||
Ok(line) => {
|
Ok(line) => {
|
||||||
let _ = editor.add_history_entry(&line);
|
let _ = editor.add_history_entry(&line);
|
||||||
if line_tx.send(Input::Line(line)).is_err() {
|
if line_tx.send(Input::Line(line)).is_err() || ack_rx.recv().is_err() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -138,7 +142,10 @@ async fn main() -> anyhow::Result<()> {
|
|||||||
input = async_line_rx.recv() => {
|
input = async_line_rx.recv() => {
|
||||||
match input {
|
match input {
|
||||||
Some(Input::Line(line)) => {
|
Some(Input::Line(line)) => {
|
||||||
if handle_line(&service, line.trim()).await {
|
let quit = handle_line(&service, line.trim()).await;
|
||||||
|
// Let the reader draw the next prompt.
|
||||||
|
let _ = ack_tx.send(());
|
||||||
|
if quit {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user