liminal-server 0.25.4

Standalone server for the liminal messaging bus
Documentation
use super::SelfStreams;
use crate::ServerError;

impl SelfStreams {
    pub(in crate::server) fn stop(&self) -> Result<(), ServerError> {
        let stopped = self.queue.stop();
        if self.queue.was_abandoned() {
            stopped?;
            return Err(Self::failure(
                "record drainer join remains unconfirmed after owned drain abandonment",
            ));
        }
        let mut owner = self.drainer.lock().map_err(|error| {
            Self::failure(&format!("record drainer join lock poisoned: {error}"))
        })?;
        owner.stopped = true;
        drop(owner.worker.take());
        let joined = owner.thread.take().map_or(Ok(()), |thread| {
            thread
                .join()
                .map_err(|_| Self::failure("record drainer join panicked"))
        });
        drop(owner);
        match (stopped, joined) {
            (Err(error), Err(join_error)) => {
                tracing::error!(%join_error, "record drainer teardown also failed");
                Err(error)
            }
            (Err(error), Ok(())) | (Ok(()), Err(error)) => Err(error),
            (Ok(()), Ok(())) => Ok(()),
        }
    }
}