use super::{ConsoleHub, TopologyChange};
use crate::console::tap_placement::TapPlacements;
use std::sync::Arc;
impl ConsoleHub {
pub(crate) fn install_placements(&self, placements: Arc<TapPlacements>) -> Result<(), String> {
self.placements
.set(placements)
.map_err(|_| "tap placements already installed")?;
let lines = self
.lock_topology()
.map_err(|error| error.to_string())?
.model
.document(&self.wall)
.0
.lines;
for line in lines {
self.offer_placement(&line.id);
}
Ok(())
}
pub(super) fn offer_change(&self, change: &TopologyChange) {
match change {
TopologyChange::Service {
subject,
present: true,
} => self.offer_placement(subject),
TopologyChange::Worker { subjects, .. } => {
for subject in subjects {
self.offer_placement(subject);
}
}
TopologyChange::Channel { name, .. } if crate::console::tappable(name) => {
self.offer_placement(name);
}
_ => {}
}
}
pub(super) fn offer_placement(&self, subject: &str) {
if let Some(placements) = self.placements.get()
&& let Err(error) = placements.offer(subject)
{
tracing::warn!(%subject, %error, "TAP_SUBJECT_PLACEMENT_FAILED");
}
}
}