p2p2/udp/
server_manager.rs

1use rand::{thread_rng, Rng};
2use serde::{Deserialize, Serialize};
3use std::net::SocketAddr;
4
5/// The [`RendezvousServerManager`] is a registry for
6/// rendezvous server locations, which can be given to a
7/// rendezvous client so it knows where to connect to.
8#[derive(Clone, Debug, Serialize, Deserialize, Default)]
9pub struct RendezvousServerManager {
10    servers: Vec<SocketAddr>,
11}
12
13impl RendezvousServerManager {
14    pub fn new() -> Self {
15        Self {
16            servers: Default::default(),
17        }
18    }
19
20    pub fn len(&self) -> usize {
21        self.servers.len()
22    }
23
24    pub fn is_empty(&self) -> bool {
25        self.servers.is_empty()
26    }
27
28    pub fn add(&mut self, addr: SocketAddr) {
29        self.servers.push(addr);
30    }
31
32    // TODO: maybe make iterator and remove rng
33    pub fn remove_random(&mut self) -> Option<SocketAddr> {
34        if self.servers.is_empty() {
35            None
36        } else {
37            let mut rng = thread_rng();
38            let index = rng.gen_range(0..self.servers.len());
39            Some(self.servers.swap_remove(index))
40        }
41    }
42}