use super::*;
pub fn own_process_group(cmd: &mut Command) {
#[cfg(unix)]
cmd.process_group(0);
#[cfg(not(unix))]
let _ = cmd;
}
pub struct ProcessGroupReaper(pub u32);
impl Drop for ProcessGroupReaper {
fn drop(&mut self) {
let _ = leviath_sys::kill_process_group(self.0);
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum ToolCapability {
ProcessSpawn,
FileSystem,
Network,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PlatformCapabilities {
capabilities: HashSet<ToolCapability>,
}
impl PlatformCapabilities {
pub fn desktop() -> Self {
Self {
capabilities: HashSet::from([
ToolCapability::ProcessSpawn,
ToolCapability::FileSystem,
ToolCapability::Network,
]),
}
}
pub fn mobile() -> Self {
Self {
capabilities: HashSet::from([ToolCapability::FileSystem, ToolCapability::Network]),
}
}
pub fn current() -> Self {
Self::desktop()
}
pub fn from_capabilities(caps: impl IntoIterator<Item = ToolCapability>) -> Self {
Self {
capabilities: caps.into_iter().collect(),
}
}
pub fn supports(&self, cap: ToolCapability) -> bool {
self.capabilities.contains(&cap)
}
pub fn satisfies(&self, required: &[ToolCapability]) -> bool {
required.iter().all(|c| self.supports(*c))
}
}
impl Default for PlatformCapabilities {
fn default() -> Self {
Self::current()
}
}
pub fn tool_required_capabilities(canonical_name: &str) -> &'static [ToolCapability] {
match canonical_name {
"shell" => &[ToolCapability::ProcessSpawn],
"read_file" | "read_files" | "write_file" | "edit_file" | "list_dir" => {
&[ToolCapability::FileSystem]
}
_ => &[],
}
}