1use std::io::Result as IoResult;
2use std::net::UdpSocket;
3
4pub mod cmd;
5
6#[derive(Debug)]
7pub struct Ip {
8 pub local: String,
9 pub network: String,
10}
11
12#[derive(Debug)]
13pub struct Host {
14 pub ip: String,
15 pub port: String,
16}
17
18impl Host {
19 pub fn get(self) -> String {
20 format!("{}:{}", self.ip, self.port)
21 }
22}
23
24pub fn ifconfig() -> IoResult<Ip> {
25 Ok(cmd::exec::ifconfig().unwrap())
26}
27
28pub fn network() -> Option<Host> {
29 let network = ifconfig().unwrap().network;
30 let host = format!("{}:{}", network, 0);
31 let socket = UdpSocket::bind(host).unwrap();
32 Some(Host{
33 ip: socket.local_addr().unwrap().ip().to_string(),
34 port: socket.local_addr().unwrap().port().to_string(),
35 })
36}
37
38pub fn local() -> Option<Host> {
39 let local = ifconfig().unwrap().local;
40 let host = format!("{}:{}", local, 0);
41 let socket = UdpSocket::bind(host).unwrap();
42 Some(Host{
43 ip: socket.local_addr().unwrap().ip().to_string(),
44 port: socket.local_addr().unwrap().port().to_string(),
45 })
46}
47
48#[cfg(test)]
49mod tests {
50 use super::*;
51
52 #[test]
53 fn test_ifconfig() {
54 assert!(ifconfig().is_ok());
55 }
56
57 #[test]
58 fn test_network() {
59 assert!(network().is_some())
60 }
61
62 #[test]
63 fn test_local() {
64 assert!(local().is_some())
65 }
66}