machine_ip/
lib.rs

1use std::net::{IpAddr, Ipv4Addr, Ipv6Addr};
2use std::process::Command;
3
4pub fn get() -> Option<IpAddr> {
5    let output = match Command::new("hostname").args(&["-I"]).output() {
6        Ok(ok) => ok,
7        Err(_) => {
8            return None;
9        }
10    };
11
12    let stdout = match String::from_utf8(output.stdout) {
13        Ok(ok) => ok,
14        Err(_) => {
15            return None;
16        }
17    };
18
19    let ips: Vec<&str> = stdout.trim().split(" ").collect::<Vec<&str>>();
20    let first = ips.first();
21    match first {
22        Some(first) => {
23            if !first.is_empty() {
24                if let Ok(addr) = first.parse::<Ipv4Addr>() {
25                    return Some(IpAddr::V4(addr));
26                } else if let Ok(addr) = first.parse::<Ipv6Addr>() {
27                    return Some(IpAddr::V6(addr));
28                } else {
29                    None
30                }
31            } else {
32                None
33            }
34        }
35        None => None,
36    }
37}
38
39#[cfg(test)]
40mod tests {
41    use super::*;
42    #[test]
43    fn it_works() {
44        let res = get();
45        println!("res: {:?}", res);
46        assert!(res.is_some());
47    }
48}