1use std::error;
4use std::str::FromStr;
5
6use mac_address::{mac_address_by_name, MacAddress};
7
8use lazy_static::lazy_static;
9use regex::Regex;
10
11pub fn is_like_kernel_name(new_devname: &str) -> bool {
13 lazy_static! {
14 static ref IS_NEW_DEVNAME_ETH_LIKE: Regex = Regex::new(r"^eth\d+$").unwrap();
22 }
23
24 IS_NEW_DEVNAME_ETH_LIKE.is_match(new_devname)
25}
26
27pub fn is_test_mode(params: &[String], number_params_required: usize) -> bool {
28 params.len() >= number_params_required
29}
30
31pub fn get_mac_address(
32 is_test_mode: bool,
33 args: &[String],
34 index: usize,
35 kernel_name: &str,
36) -> Result<MacAddress, Box<dyn error::Error>> {
37 let mac_address = if is_test_mode {
38 let mac_address = args[index].clone();
39 MacAddress::from_str(&mac_address)?
40 } else {
41 match mac_address_by_name(kernel_name)? {
42 Some(mac) => mac,
43 None => panic!(),
44 }
45 };
46
47 Ok(mac_address)
48}
49
50#[cfg(test)]
51pub mod should {
52 use super::*;
53
54 #[test]
55 #[should_panic]
56 fn check_for_test_mode() {
57 const NUMBER_PARAMS_REQUIRED: usize = 3;
58 const ARGS: Vec<String> = Vec::new();
59
60 let is_test_mode = is_test_mode(&ARGS, NUMBER_PARAMS_REQUIRED);
61
62 assert!(is_test_mode);
63 }
64
65 #[test]
66 fn check_if_is_like_kernel_name() {
67 const KERNEL_LIKE_NAME: &str = "eth123";
68
69 let is_like_kernel = is_like_kernel_name(KERNEL_LIKE_NAME);
70
71 assert!(is_like_kernel);
72 }
73
74 #[test]
75 #[should_panic]
76 fn not_get_mac_address() {
77 const IS_TEST_MODE: bool = false;
78 const ARGS: &Vec<String> = &Vec::new();
79 const INDEX: usize = 3;
80 let kernel_name: String = String::from_str("this-should-fail").unwrap();
81
82 let _ = get_mac_address(IS_TEST_MODE, ARGS, INDEX, &kernel_name);
83 }
84}