use anyhow::{bail, Result};
use clap::Parser;
use io_stream::runtimes::std::handle;
use io_timer::client::coroutines::{send::SendRequestResult, start::StartTimer};
use pimalaya_toolbox::terminal::printer::{Message, Printer};
use crate::{account::Account, protocol::ProtocolArg, stream};
#[derive(Debug, Parser)]
pub struct StartTimerCommand {
#[command(flatten)]
pub protocol: ProtocolArg,
}
impl StartTimerCommand {
pub fn execute(self, printer: &mut impl Printer, account: &Account) -> Result<()> {
let protocol = match &*self.protocol {
Some(protocol) => protocol.clone(),
None => account.get_default_protocol()?,
};
let mut stream = stream::connect(&account, &protocol)?;
let mut arg = None;
let mut start = StartTimer::new();
loop {
match start.resume(arg.take()) {
SendRequestResult::Ok(_) => break,
SendRequestResult::Io(io) => arg = Some(handle(&mut stream, io)?),
SendRequestResult::Err(err) => bail!(err),
}
}
printer.out(Message::new("Timer successfully started"))
}
}