hosts.rs 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. use async_std::sync::Mutex;
  2. use rand::seq::SliceRandom;
  3. use std::net::SocketAddr;
  4. use std::sync::Arc;
  5. use std::collections::HashSet;
  6. pub type HostsPtr = Arc<Hosts>;
  7. pub struct Hosts {
  8. addrs: Mutex<Vec<SocketAddr>>,
  9. }
  10. impl Hosts {
  11. pub fn new() -> Arc<Self> {
  12. Arc::new(Self {
  13. addrs: Mutex::new(Vec::new()),
  14. })
  15. }
  16. async fn contains(&self, addrs: &Vec<SocketAddr>) -> bool {
  17. let a_set: HashSet<_> = addrs.iter().copied().collect();
  18. self.addrs.lock().await.iter().any(|item| a_set.contains(item))
  19. }
  20. pub async fn store(&self, addrs: Vec<SocketAddr>) {
  21. if !self.contains(&addrs).await {
  22. self.addrs.lock().await.extend(addrs)
  23. }
  24. }
  25. pub async fn load_single(&self) -> Option<SocketAddr> {
  26. self.addrs
  27. .lock()
  28. .await
  29. .choose(&mut rand::thread_rng())
  30. .cloned()
  31. }
  32. pub async fn load_all(&self) -> Vec<SocketAddr> {
  33. self.addrs.lock().await.clone()
  34. }
  35. pub async fn is_empty(&self) -> bool {
  36. self.addrs.lock().await.is_empty()
  37. }
  38. }