♻️ refactor: move more Windows-only code behind cfg flags
parent
dbedc6083e
commit
ee51bb7d3d
44
src/ip.rs
44
src/ip.rs
|
@ -6,16 +6,20 @@ use std::{
|
|||
|
||||
use crate::AppError;
|
||||
|
||||
pub fn get_ip_addr_output () -> Result <String, AppError> {
|
||||
#[cfg(target_os = "linux")]
|
||||
pub mod linux {
|
||||
use super::*;
|
||||
|
||||
pub fn get_ip_addr_output () -> Result <String, AppError> {
|
||||
let output = Command::new ("ip")
|
||||
.arg ("addr")
|
||||
.output ()?;
|
||||
let output = output.stdout.as_slice ();
|
||||
let output = String::from_utf8 (output.to_vec ())?;
|
||||
Ok (output)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn parse_ip_addr_output (output: &str) -> Vec <Ipv4Addr> {
|
||||
pub fn parse_ip_addr_output (output: &str) -> Vec <Ipv4Addr> {
|
||||
// I wrote this in FP style because I was bored.
|
||||
|
||||
output.lines ()
|
||||
|
@ -24,17 +28,22 @@ pub fn parse_ip_addr_output (output: &str) -> Vec <Ipv4Addr> {
|
|||
.filter_map (|l| l.find ('/').map (|x| &l [0..x]))
|
||||
.filter_map (|l| Ipv4Addr::from_str (l).ok ())
|
||||
.collect ()
|
||||
}
|
||||
}
|
||||
|
||||
pub fn get_ip_config_output () -> Result <String, AppError> {
|
||||
#[cfg(target_os = "windows")]
|
||||
pub mod windows {
|
||||
use super::*;
|
||||
|
||||
pub fn get_ip_config_output () -> Result <String, AppError> {
|
||||
let output = Command::new ("ipconfig")
|
||||
.output ()?;
|
||||
let output = output.stdout.as_slice ();
|
||||
let output = String::from_utf8 (output.to_vec ())?;
|
||||
Ok (output)
|
||||
}
|
||||
}
|
||||
|
||||
pub fn parse_ip_config_output (output: &str) -> Vec <Ipv4Addr> {
|
||||
pub fn parse_ip_config_output (output: &str) -> Vec <Ipv4Addr> {
|
||||
let mut addrs = vec! [];
|
||||
|
||||
for line in output.lines () {
|
||||
|
@ -59,4 +68,27 @@ pub fn parse_ip_config_output (output: &str) -> Vec <Ipv4Addr> {
|
|||
}
|
||||
|
||||
addrs
|
||||
}
|
||||
|
||||
#[cfg (test)]
|
||||
mod test {
|
||||
use super::*;
|
||||
|
||||
#[test]
|
||||
fn test () {
|
||||
for (input, expected) in [
|
||||
(
|
||||
r"
|
||||
IPv4 Address . . .. . . . : 192.168.1.1
|
||||
",
|
||||
vec! [
|
||||
Ipv4Addr::new (192, 168, 1, 1),
|
||||
]
|
||||
),
|
||||
] {
|
||||
let actual = parse_ip_config_output (input);
|
||||
assert_eq! (actual, expected);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -111,9 +111,9 @@ async fn async_main () -> Result <(), AppError> {
|
|||
|
||||
#[cfg(target_os = "linux")]
|
||||
fn my_ips () -> Result <(), AppError> {
|
||||
let output = ip::get_ip_addr_output ()?;
|
||||
let output = ip::linux::get_ip_addr_output ()?;
|
||||
|
||||
for addr in ip::parse_ip_addr_output (&output)
|
||||
for addr in ip::linux::parse_ip_addr_output (&output)
|
||||
.iter ()
|
||||
.filter (|a| ! a.is_loopback ())
|
||||
{
|
||||
|
@ -131,9 +131,9 @@ fn my_ips () -> Result <(), AppError> {
|
|||
|
||||
#[cfg(target_os = "windows")]
|
||||
fn my_ips () -> Result <(), AppError> {
|
||||
let output = ip::get_ip_config_output ()?;
|
||||
let output = ip::windows::get_ip_config_output ()?;
|
||||
|
||||
for addr in ip::parse_ip_config_output (&output) {
|
||||
for addr in ip::windows::parse_ip_config_output (&output) {
|
||||
println! ("{:?}", addr);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue