liminal-server 0.24.9

Standalone server for the liminal messaging bus
Documentation
//! A line tells the placement worker once, without coupling traffic to Lys.

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");
        }
    }
}