use std::collections::{BTreeMap, BTreeSet};
use crate::error::{Error, Result};
use crate::plan::Plan;
pub(crate) use onevcs::Liveness;
pub(crate) use onevcs::Lifecycle as State;
pub(crate) use onevcs::SessionHolder as Holder;
pub fn holders(plan: &Plan) -> Result<Vec<Holder>> {
let repos: BTreeSet<_> = plan
.tasks
.iter()
.filter_map(|node| node.repo.as_deref())
.collect();
let mut by_identity_and_token = BTreeMap::new();
for repo in repos {
let found = onevcs::session_holders(repo).map_err(|error| {
sibling(format!(
"cannot read the session holders of {repo}: {error}"
))
})?;
for holder in found {
by_identity_and_token.insert((holder.identity.clone(), holder.token.clone()), holder);
}
}
Ok(by_identity_and_token.into_values().collect())
}
fn sibling(message: String) -> Error {
Error::Sibling {
tool: "onevcs",
message,
}
}