1use crate::writer::AsyncLogWriter;
2use async_trait::async_trait;
3use std::time::SystemTime;
4
5pub struct MultiWriter<T>
6where
7 T: AsyncLogWriter,
8{
9 writers: Vec<T>,
10}
11
12impl<T: AsyncLogWriter> MultiWriter<T> {
13 pub fn new(writers: Vec<T>) -> Self {
14 Self { writers }
15 }
16}
17
18#[async_trait]
19impl<T: AsyncLogWriter + Send> AsyncLogWriter for MultiWriter<T> {
20 async fn write_logs(&mut self, time: SystemTime, buf: &[u8]) -> std::io::Result<()> {
21 for writer in self.writers.iter_mut() {
22 writer.write_logs(time, buf).await?;
23 }
24 Ok(())
25 }
26}
27
28#[cfg(test)]
29mod tests {
30 use super::*;
31 use crate::writer::MockAsyncLogWriter;
32 use mockall::predicate::*;
33 use std::ops::Add;
34 use std::time::Duration;
35
36 #[tokio::test]
37 async fn test_write_to_multiple_writers() {
38 let mut mock_writer1 = MockAsyncLogWriter::new();
39 let mut mock_writer2 = MockAsyncLogWriter::new();
40
41 let time1 = SystemTime::now();
42 let buf1: &[u8] = b"test1";
43 let time2 = time1.add(Duration::new(100, 0));
44 let buf2: &[u8] = b"test2";
45 mock_writer1
46 .expect_write_logs()
47 .with(eq(time1), eq(buf1))
48 .returning(|_, _| Ok(()));
49 mock_writer1
50 .expect_write_logs()
51 .with(eq(time2), eq(buf2))
52 .returning(|_, _| Ok(()));
53 mock_writer2
54 .expect_write_logs()
55 .with(eq(time1), eq(buf1))
56 .returning(|_, _| Ok(()));
57 mock_writer2
58 .expect_write_logs()
59 .with(eq(time2), eq(buf2))
60 .returning(|_, _| Ok(()));
61
62 let mut multi_writer = MultiWriter::new(vec![mock_writer1, mock_writer2]);
63
64 let result = multi_writer.write_logs(time1, buf1).await;
65 assert!(result.is_ok());
66 let result = multi_writer.write_logs(time2, buf2).await;
67 assert!(result.is_ok());
68 }
69}