use arbitrary::Arbitrary;
use facet::Facet;
use figue::{self as args};
#[derive(Facet, Arbitrary, PartialEq, Debug, Default)]
#[facet(rename_all = "kebab-case")]
pub struct ServiceLogsArgs {
#[facet(args::named, args::short = 'f', default)]
pub follow: bool,
#[facet(args::named, default)]
pub no_replay: bool,
}
impl ServiceLogsArgs {
pub fn invoke(self) -> eyre::Result<()> {
let config = crate::machine::ipc::load_machine_daemon_client_config()?;
let ready_daemon = crate::machine::ipc::ensure_daemon_ready(&config)?;
crate::machine::ipc::ensure_rpc_compatibility(&ready_daemon.ping)?;
let (logs_tx, logs_rx) = vox::channel::<crate::machine::daemon_log::DaemonLogWireEvent>();
let (_cancel_tx, cancel_rx) = vox::channel::<u8>();
let log_drain = crate::machine::daemon_log::spawn_stderr_log_drain(logs_rx);
let result = crate::machine::ipc::stream_logs(
&config,
crate::machine::ipc::LogStreamRequest {
replay_recent: !self.no_replay,
follow: self.follow,
},
logs_tx,
cancel_rx,
);
let _ = log_drain.join();
result
}
}