Skip to main content

minecraft_pinger/
config.rs

1use std::net::IpAddr;
2use std::sync::Arc;
3use std::time::Duration;
4
5use crate::common::ip_filter::{IpFilter, is_public_ip};
6
7pub const DEFAULT_PROTOCOL_VERSION: i32 = 775;
8pub const DEFAULT_TIMEOUT: Duration = Duration::from_secs(1);
9
10#[derive(Clone)]
11pub struct PingConfig {
12    timeout: Duration,
13    ip_filter: Option<Arc<IpFilter>>,
14}
15
16impl PingConfig {
17    pub fn builder() -> PingConfigBuilder {
18        PingConfigBuilder::new()
19    }
20
21    // Remove it ?
22    pub fn to_builder(&self) -> PingConfigBuilder {
23        PingConfigBuilder {
24            timeout: self.timeout,
25            ip_filter: self.ip_filter.clone(),
26        }
27    }
28
29    pub fn timeout(&self) -> Duration {
30        self.timeout
31    }
32    
33    pub fn ip_filter(&self) -> Option<&Arc<IpFilter>> {
34        self.ip_filter.as_ref()
35    }
36}
37
38impl Default for PingConfig {
39    fn default() -> Self {
40        Self::builder().build()
41    }
42}
43
44#[derive(Clone)]
45pub struct PingConfigBuilder {
46    timeout: Duration,
47    ip_filter: Option<Arc<IpFilter>>,
48}
49
50impl PingConfigBuilder {
51    pub fn new() -> PingConfigBuilder {
52        PingConfigBuilder {
53            timeout: DEFAULT_TIMEOUT,
54            ip_filter: None,
55        }
56    }
57
58    pub fn set_timeout(mut self, timeout: Duration) -> PingConfigBuilder {
59        self.timeout = timeout;
60        self
61    }
62    
63    pub fn deny_non_public_ips(mut self) -> PingConfigBuilder {
64        self.ip_filter = Some(Arc::new(is_public_ip));
65        self
66    }
67    
68    pub fn set_ip_filter<F>(mut self, filter: F) -> PingConfigBuilder
69    where
70        F: Fn(IpAddr) -> bool + Send + Sync + 'static,
71    {
72        self.ip_filter = Some(Arc::new(filter));
73        self
74    }
75
76    pub fn build(self) -> PingConfig {
77        PingConfig {
78            timeout: self.timeout,
79            ip_filter: self.ip_filter,
80        }
81    }
82}