logup/
writer_multi.rs

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}