sc_utils/notification/
registry.rs

1// This file is part of Substrate.
2
3// Copyright (C) Parity Technologies (UK) Ltd.
4// SPDX-License-Identifier: GPL-3.0-or-later WITH Classpath-exception-2.0
5
6// This program is free software: you can redistribute it and/or modify
7// it under the terms of the GNU General Public License as published by
8// the Free Software Foundation, either version 3 of the License, or
9// (at your option) any later version.
10
11// This program is distributed in the hope that it will be useful,
12// but WITHOUT ANY WARRANTY; without even the implied warranty of
13// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14// GNU General Public License for more details.
15
16// You should have received a copy of the GNU General Public License
17// along with this program. If not, see <https://www.gnu.org/licenses/>.
18
19use std::collections::HashSet;
20
21use crate::{
22	id_sequence::SeqID,
23	pubsub::{Dispatch, Subscribe, Unsubscribe},
24};
25
26/// The shared structure to keep track on subscribers.
27#[derive(Debug, Default)]
28pub(super) struct Registry {
29	pub(super) subscribers: HashSet<SeqID>,
30}
31
32impl Subscribe<()> for Registry {
33	fn subscribe(&mut self, _subs_key: (), subs_id: SeqID) {
34		self.subscribers.insert(subs_id);
35	}
36}
37impl Unsubscribe for Registry {
38	fn unsubscribe(&mut self, subs_id: SeqID) {
39		self.subscribers.remove(&subs_id);
40	}
41}
42
43impl<MakePayload, Payload, Error> Dispatch<MakePayload> for Registry
44where
45	MakePayload: FnOnce() -> Result<Payload, Error>,
46	Payload: Clone,
47{
48	type Item = Payload;
49	type Ret = Result<(), Error>;
50
51	fn dispatch<F>(&mut self, make_payload: MakePayload, mut dispatch: F) -> Self::Ret
52	where
53		F: FnMut(&SeqID, Self::Item),
54	{
55		if !self.subscribers.is_empty() {
56			let payload = make_payload()?;
57			for subs_id in &self.subscribers {
58				dispatch(subs_id, payload.clone());
59			}
60		}
61		Ok(())
62	}
63}