stak_profiler/
write.rs

1use crate::Record;
2use core::error::Error;
3use std::io::{self, Write};
4
5/// Writes profile records.
6pub fn write_records<R: Record, E: Error + From<io::Error>>(
7    records: impl IntoIterator<Item = Result<R, E>>,
8    mut writer: impl Write,
9) -> Result<(), E> {
10    for record in records {
11        writeln!(writer, "{}", record?)?;
12    }
13
14    Ok(())
15}
16
17#[cfg(test)]
18mod tests {
19    use super::*;
20    use crate::{Error, ProcedureOperation, ProcedureRecord, Stack};
21    use indoc::indoc;
22    use pretty_assertions::assert_eq;
23
24    #[test]
25    fn write() {
26        let mut buffer = vec![];
27
28        write_records::<_, Error>(
29            [
30                Ok(ProcedureRecord::new(
31                    ProcedureOperation::Call,
32                    Stack::new(vec![Some("baz".into())]),
33                    0,
34                )),
35                Ok(ProcedureRecord::new(
36                    ProcedureOperation::Return,
37                    Stack::new(vec![Some("foo".into()), Some("bar".into())]),
38                    42,
39                )),
40                Ok(ProcedureRecord::new(
41                    ProcedureOperation::ReturnCall,
42                    Stack::new(vec![None; 3]),
43                    2045,
44                )),
45            ],
46            &mut buffer,
47        )
48        .unwrap();
49
50        assert_eq!(
51            buffer,
52            indoc!(
53                // spell-checker: disable
54                b"
55                call\tbaz\t0
56                return\tfoo;bar\t42
57                return_call\t;;\t2045
58                "
59            )
60        );
61    }
62}