(value: &str)
| 909 | } |
| 910 | |
| 911 | fn parse_nettop_byte_value(value: &str) -> Option<u64> { |
| 912 | let value = value.trim().trim_matches('"').replace('_', ""); |
| 913 | if value.is_empty() || value == "-" { |
| 914 | return None; |
| 915 | } |
| 916 | if let Ok(bytes) = value.parse::<u64>() { |
| 917 | return Some(bytes); |
| 918 | } |
| 919 | |
| 920 | let number_end = value |
| 921 | .char_indices() |
| 922 | .find_map(|(index, character)| { |
| 923 | (!character.is_ascii_digit() && character != '.').then_some(index) |
| 924 | }) |
| 925 | .unwrap_or(value.len()); |
| 926 | if number_end == 0 { |
| 927 | return None; |
| 928 | } |
| 929 | |
| 930 | let number = value[..number_end].parse::<f64>().ok()?; |
| 931 | if !number.is_finite() || number < 0.0 { |
| 932 | return None; |
| 933 | } |
| 934 | let suffix = value[number_end..] |
| 935 | .trim() |
| 936 | .trim_end_matches("/s") |
| 937 | .to_ascii_lowercase(); |
| 938 | let multiplier = match suffix.as_str() { |
| 939 | "" | "b" | "byte" | "bytes" => 1.0, |
| 940 | "k" | "kb" | "kib" => 1024.0, |
| 941 | "m" | "mb" | "mib" => 1024.0 * 1024.0, |
| 942 | "g" | "gb" | "gib" => 1024.0 * 1024.0 * 1024.0, |
| 943 | "t" | "tb" | "tib" => 1024.0 * 1024.0 * 1024.0 * 1024.0, |
| 944 | _ => return None, |
| 945 | }; |
| 946 | Some((number * multiplier).round() as u64) |
| 947 | } |
| 948 | |
| 949 | fn compact_lsof_endpoint(line: &str) -> String { |
| 950 | line.split_whitespace() |
no test coverage detected