use std::path::PathBuf;
use std::time::Duration;
use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use uuid::Uuid;
use crate::error::Result;
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct ProcessSpawnSpec {
pub program: String,
pub args: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub cwd: Option<PathBuf>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub struct ProcessHandle {
pub id: Uuid,
pub pid: u32,
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub enum ProcessState {
Running {
pid: u32,
},
Exited {
pid: u32,
code: Option<i32>,
},
}
#[async_trait]
pub trait ProcessPort: Send + Sync {
async fn spawn(&self, spec: &ProcessSpawnSpec) -> Result<ProcessHandle>;
async fn status(&self, handle: &ProcessHandle) -> Result<ProcessState>;
async fn wait_with_timeout(
&self,
handle: &ProcessHandle,
timeout: Duration,
) -> Result<ProcessState>;
async fn kill_group(&self, handle: &ProcessHandle) -> Result<()>;
}