mirror of
https://github.com/chatmail/core.git
synced 2026-05-20 15:26:30 +03:00
examples: fix blocking the scheduler in the repl
This commit is contained in:
@@ -290,48 +290,59 @@ async fn start(args: Vec<String>) -> Result<(), Error> {
|
|||||||
.edit_mode(EditMode::Emacs)
|
.edit_mode(EditMode::Emacs)
|
||||||
.output_stream(OutputStreamType::Stdout)
|
.output_stream(OutputStreamType::Stdout)
|
||||||
.build();
|
.build();
|
||||||
let h = DcHelper {
|
|
||||||
completer: FilenameCompleter::new(),
|
|
||||||
highlighter: MatchingBracketHighlighter::new(),
|
|
||||||
hinter: HistoryHinter {},
|
|
||||||
};
|
|
||||||
let mut rl = Editor::with_config(config);
|
|
||||||
rl.set_helper(Some(h));
|
|
||||||
rl.bind_sequence(KeyPress::Meta('N'), Cmd::HistorySearchForward);
|
|
||||||
rl.bind_sequence(KeyPress::Meta('P'), Cmd::HistorySearchBackward);
|
|
||||||
if rl.load_history(".dc-history.txt").is_err() {
|
|
||||||
println!("No previous history.");
|
|
||||||
}
|
|
||||||
|
|
||||||
let mut selected_chat = ChatId::default();
|
let mut selected_chat = ChatId::default();
|
||||||
|
let (reader_s, reader_r) = async_std::sync::channel(100);
|
||||||
|
let input_loop = async_std::task::spawn_blocking(move || {
|
||||||
|
let h = DcHelper {
|
||||||
|
completer: FilenameCompleter::new(),
|
||||||
|
highlighter: MatchingBracketHighlighter::new(),
|
||||||
|
hinter: HistoryHinter {},
|
||||||
|
};
|
||||||
|
let mut rl = Editor::with_config(config);
|
||||||
|
rl.set_helper(Some(h));
|
||||||
|
rl.bind_sequence(KeyPress::Meta('N'), Cmd::HistorySearchForward);
|
||||||
|
rl.bind_sequence(KeyPress::Meta('P'), Cmd::HistorySearchBackward);
|
||||||
|
if rl.load_history(".dc-history.txt").is_err() {
|
||||||
|
println!("No previous history.");
|
||||||
|
}
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let p = "> ";
|
let p = "> ";
|
||||||
let readline = rl.readline(&p);
|
let readline = rl.readline(&p);
|
||||||
match readline {
|
|
||||||
Ok(line) => {
|
match readline {
|
||||||
// TODO: ignore "set mail_pw"
|
Ok(line) => {
|
||||||
rl.add_history_entry(line.as_str());
|
// TODO: ignore "set mail_pw"
|
||||||
match handle_cmd(line.trim(), context.clone(), &mut selected_chat).await {
|
rl.add_history_entry(line.as_str());
|
||||||
Ok(ExitResult::Continue) => {}
|
async_std::task::block_on(reader_s.send(line));
|
||||||
Ok(ExitResult::Exit) => break,
|
}
|
||||||
Err(err) => println!("Error: {}", err),
|
Err(ReadlineError::Interrupted) | Err(ReadlineError::Eof) => {
|
||||||
|
println!("Exiting...");
|
||||||
|
drop(reader_s);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Err(err) => {
|
||||||
|
println!("Error: {}", err);
|
||||||
|
drop(reader_s);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(ReadlineError::Interrupted) | Err(ReadlineError::Eof) => {
|
}
|
||||||
println!("Exiting...");
|
|
||||||
context.stop_io().await;
|
rl.save_history(".dc-history.txt")?;
|
||||||
break;
|
println!("history saved");
|
||||||
}
|
Ok::<_, Error>(())
|
||||||
Err(err) => {
|
});
|
||||||
println!("Error: {}", err);
|
|
||||||
break;
|
while let Ok(line) = reader_r.recv().await {
|
||||||
}
|
match handle_cmd(line.trim(), context.clone(), &mut selected_chat).await {
|
||||||
|
Ok(ExitResult::Continue) => {}
|
||||||
|
Ok(ExitResult::Exit) => break,
|
||||||
|
Err(err) => println!("Error: {}", err),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
context.stop_io().await;
|
||||||
rl.save_history(".dc-history.txt")?;
|
input_loop.await?;
|
||||||
println!("history saved");
|
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user