use std::collections::BTreeSet;
use crate::engine::ComposeEngine;
use crate::error::Result;
use crate::status::ProjectStatus;
#[derive(Clone, Debug, PartialEq, Eq)]
pub enum ProjectMatch {
Exact(BTreeSet<String>),
Prefix(String),
}
impl ProjectMatch {
pub fn matches(&self, name: &str) -> bool {
match self {
ProjectMatch::Exact(names) => names.contains(name),
ProjectMatch::Prefix(prefix) => name.starts_with(prefix.as_str()),
}
}
}
pub async fn managed_projects(
engine: &dyn ComposeEngine,
which: &ProjectMatch,
) -> Result<Vec<ProjectStatus>> {
Ok(engine
.ls()
.await?
.into_iter()
.filter(|p| which.matches(&p.name))
.collect())
}
pub async fn remove_mesh_if_idle(
engine: &dyn ComposeEngine,
network: &str,
members: &BTreeSet<String>,
) -> Result<bool> {
let running = managed_projects(engine, &ProjectMatch::Exact(members.clone())).await?;
if !running.is_empty() {
return Ok(false);
}
engine.network_rm(network).await
}