1use std::fs::File;
2use std::io::Read;
3use std::path::PathBuf;
4
5use subprocess::{Exec, ExitStatus};
6use walkdir::WalkDir;
7
8pub struct Files;
9
10impl Files {
11 pub fn read_string(path: &str) -> String {
12 let mut f = File::open(path).unwrap();
13 let mut content = String::new();
14 f.read_to_string(&mut content).unwrap();
15
16 content
17 }
18
19 pub fn read_vector(path: &str) -> Vec<u8> {
20 let mut f = File::open(path).unwrap();
21 let mut buffer = Vec::new();
22 f.read_to_end(&mut buffer).unwrap();
23
24 buffer
25 }
26
27 pub fn find_files(path_buf: &PathBuf, extension: &str) -> Vec<PathBuf> {
28 WalkDir::new(path_buf)
29 .into_iter()
30 .take_while(|entry| entry.is_ok())
31 .map(|entry| { entry.unwrap() })
32 .filter(|entry| { entry.file_type().is_file() && entry.path().extension().map_or(false, |ext| ext == extension) })
33 .map(|entry| { entry.path().to_path_buf() })
34 .collect()
35 }
36
37 pub fn which(app_name: &str) -> ExitStatus {
38 Exec::cmd("which")
39 .arg(app_name)
40 .capture().unwrap().exit_status
41 }
42}
43
44#[cfg(test)]
45mod tests {
46 use crate::test_resources;
47
48 use super::*;
49
50 #[test]
51 fn expected_read_file_as_binary() {
52 let buf = Files::read_vector(test_resources!("captures/arp.pcap"));
53
54 println!("full packet {:?}", buf);
55 assert_eq!(buf.len(), 70);
56
57 let global_header = &buf[..24];
58 println!("global header {:?}", global_header);
59 assert_eq!(global_header.len(), 24);
60
61 let packet_header = &buf[24..40];
62 println!("packet header {:?}", packet_header);
63 assert_eq!(packet_header.len(), 16);
64
65 let ethernet_header = &buf[40..54];
66 println!("ethernet header {:?}", ethernet_header);
67 }
68
69 #[test]
70 fn expected_read_file_string() {
71 let content = Files::read_string(test_resources!("captures/arp.json"));
72
73 println!("full packet {:?}", content);
74 assert_eq!(content.len(), 1833);
75 }
76}