hosts.rs 826 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. use async_std::sync::Mutex;
  2. use rand::seq::SliceRandom;
  3. use std::net::SocketAddr;
  4. use std::sync::Arc;
  5. use crate::net::SettingsPtr;
  6. pub type HostsPtr = Arc<Hosts>;
  7. pub struct Hosts {
  8. addrs: Mutex<Vec<SocketAddr>>,
  9. settings: SettingsPtr,
  10. }
  11. impl Hosts {
  12. pub fn new(settings: SettingsPtr) -> Arc<Self> {
  13. Arc::new(Self {
  14. addrs: Mutex::new(Vec::new()),
  15. settings,
  16. })
  17. }
  18. pub async fn store(&self, addrs: Vec<SocketAddr>) {
  19. self.addrs.lock().await.extend(addrs)
  20. }
  21. pub async fn load_single(&self) -> Option<SocketAddr> {
  22. self.addrs
  23. .lock()
  24. .await
  25. .choose(&mut rand::thread_rng())
  26. .cloned()
  27. }
  28. pub async fn load_all(&self) -> Vec<SocketAddr> {
  29. self.addrs.lock().await.clone()
  30. }
  31. }