1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
use crate::api::error; use crate::tcpros::{Publisher, PublisherStream, Topic}; use crate::util::FAILED_TO_LOCK; use crate::Message; use std::collections::HashMap; use std::iter::FromIterator; use std::sync::{Arc, Mutex}; #[derive(Clone, Default)] pub struct PublicationsTracker { mapping: Arc<Mutex<HashMap<String, Publisher>>>, } impl PublicationsTracker { #[inline] pub fn get_topic_names<T: FromIterator<String>>(&self) -> T { self.mapping .lock() .expect(FAILED_TO_LOCK) .keys() .cloned() .collect() } #[inline] pub fn get_topics<T: FromIterator<Topic>>(&self) -> T { self.mapping .lock() .expect(FAILED_TO_LOCK) .values() .map(Publisher::get_topic) .cloned() .collect() } #[inline] pub fn get_port(&self, topic: &str) -> Option<i32> { self.mapping .lock() .expect(FAILED_TO_LOCK) .get(topic) .map(|publisher| i32::from(publisher.port)) } pub fn add<T: Message>( &self, hostname: &str, topic: &str, queue_size: usize, caller_id: &str, ) -> error::tcpros::Result<PublisherStream<T>> { use std::collections::hash_map::Entry; match self .mapping .lock() .expect(FAILED_TO_LOCK) .entry(String::from(topic)) { Entry::Occupied(publisher_entry) => publisher_entry.get().stream(queue_size), Entry::Vacant(entry) => { let publisher = Publisher::new::<T, _>( format!("{}:0", hostname).as_str(), topic, queue_size, caller_id, )?; entry.insert(publisher).stream(queue_size) } } } #[inline] pub fn remove(&self, topic: &str) { self.mapping.lock().expect(FAILED_TO_LOCK).remove(topic); } }