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}