1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
use std::net::SocketAddr;

use socket2::SockAddr;

use crate::ICMP;

#[derive(Debug, Default)]
pub struct Config {
    pub kind: ICMP,
    pub bind: Option<SockAddr>,
    pub interface: Option<String>,
    pub ttl: Option<u32>,
    pub fib: Option<u32>,
}

impl Config {
    /// A structure that can be specially configured for socket.
    pub fn new() -> Self {
        Self::default()
    }

    pub fn builder() -> ConfigBuilder {
        ConfigBuilder::default()
    }
}

#[derive(Debug, Default)]
pub struct ConfigBuilder {
    kind: ICMP,
    bind: Option<SockAddr>,
    interface: Option<String>,
    ttl: Option<u32>,
    fib: Option<u32>,
}

impl ConfigBuilder {
    pub fn bind(mut self, bind: SocketAddr) -> Self {
        self.bind = Some(SockAddr::from(bind));
        self
    }

    pub fn interface(mut self, interface: &str) -> Self {
        self.interface = Some(interface.to_string());
        self
    }

    pub fn ttl(mut self, ttl: u32) -> Self {
        self.ttl = Some(ttl);
        self
    }

    pub fn fib(mut self, fib: u32) -> Self {
        self.fib = Some(fib);
        self
    }

    pub fn kind(mut self, kind: ICMP) -> Self {
        self.kind = kind;
        self
    }

    pub fn build(self) -> Config {
        Config {
            kind: self.kind,
            bind: self.bind,
            interface: self.interface,
            ttl: self.ttl,
            fib: self.fib,
        }
    }
}