use std::future::Future;
use arcbox_connect::v1::{MachineExecOutput, MachineExecRequest};
use arcbox_engine::agent_client::{ExecSessionInput, ExecSessionOutput};
use tokio::sync::mpsc;
pub trait MachineHost: Send + Sync + 'static {
type Output: ExecOutput;
fn exec(
&self,
machine: &str,
request: MachineExecRequest,
input: mpsc::Receiver<ExecSessionInput>,
) -> impl Future<Output = anyhow::Result<Self::Output>> + Send;
fn connect_tcp(
&self,
machine: &str,
host: &str,
port: u16,
input: mpsc::Receiver<ExecSessionInput>,
) -> impl Future<Output = anyhow::Result<Self::Output>> + Send;
}
pub trait ExecOutput: Send + 'static {
fn recv(
&mut self,
) -> impl Future<Output = Option<arcbox_engine::Result<MachineExecOutput>>> + Send;
}
impl ExecOutput for ExecSessionOutput {
fn recv(
&mut self,
) -> impl Future<Output = Option<arcbox_engine::Result<MachineExecOutput>>> + Send {
Self::recv(self)
}
}