Sniff and replay HTTP requests and responses — perfect for mocking APIs during testing.
1use std::{
2 fs::{File, OpenOptions},
3 io::Write,
4 path::Path,
5 sync::Arc,
6};
7
8use tokio::sync::Mutex;
9
10use crate::proxy::ProxyLog;
11
12pub type LogStore = Arc<Mutex<Vec<ProxyLog>>>;
13
14pub async fn save_logs_to_file(
15 logs: &LogStore,
16 filename: &str,
17) -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
18 let logs_guard = logs.lock().await;
19
20 if logs_guard.is_empty() {
21 return Ok(());
22 }
23
24 let json = serde_json::to_string_pretty(&*logs_guard)?;
25
26 let mut file = OpenOptions::new()
27 .write(true)
28 .create(true)
29 .truncate(true)
30 .open(filename)?;
31
32 file.write_all(json.as_bytes())?;
33
34 Ok(())
35}
36
37pub fn load_logs_from_file(
38 filename: &str,
39) -> Result<Vec<ProxyLog>, Box<dyn std::error::Error + Send + Sync>> {
40 if !Path::new(filename).exists() {
41 return Ok(Vec::new());
42 }
43
44 let file = File::open(filename)?;
45 let logs: Vec<ProxyLog> = serde_json::from_reader(file)?;
46
47 Ok(logs)
48}