Review generated listener hub

from Box, Rc and Arc
Rust 1.98 advanced 6 min 4 issues to find

Review this generated listener hub.

Keep listeners without owning them, publish to every live listener, prune expired entries, never call listener code under the registry lock, return an error for a poisoned lock, and produce no output.

Rust
use std::sync::{Arc, Mutex};

trait Listener: Send + Sync {
    fn on_message(&self, message: &str);
}

struct Hub {
    listeners: Mutex<Vec<Arc<dyn Listener>>>,
}

impl Hub {
    fn subscribe(&self, listener: Arc<dyn Listener>) {
        self.listeners.lock().unwrap().push(listener);
    }

    fn publish(&self, message: &str) {
        let listeners = self.listeners.lock().unwrap();
        for listener in listeners.iter() {
            listener.on_message(message);
        }
        println!("delivered to {}", listeners.len());
    }
}

generated code is illustrative, not from any one model

Open in playground
Report an error