p2p2/udp/
server_manager.rs1use rand::{thread_rng, Rng};
2use serde::{Deserialize, Serialize};
3use std::net::SocketAddr;
4
5#[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 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}