stak_profiler/
write.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
use crate::Record;
use core::error::Error;
use std::io::{self, Write};

/// Writes profile records.
pub fn write_records<R: Record, E: Error + From<io::Error>>(
    records: impl IntoIterator<Item = Result<R, E>>,
    mut writer: impl Write,
) -> Result<(), E> {
    for record in records {
        writeln!(writer, "{}", record?)?;
    }

    Ok(())
}

#[cfg(test)]
mod tests {
    use super::*;
    use crate::{Error, ProcedureOperation, ProcedureRecord, Stack};
    use indoc::indoc;
    use pretty_assertions::assert_eq;

    #[test]
    fn write() {
        let mut buffer = vec![];

        write_records::<_, Error>(
            [
                Ok(ProcedureRecord::new(
                    ProcedureOperation::Call,
                    Stack::new(vec![Some("baz".into())]),
                    0,
                )),
                Ok(ProcedureRecord::new(
                    ProcedureOperation::Return,
                    Stack::new(vec![Some("foo".into()), Some("bar".into())]),
                    42,
                )),
                Ok(ProcedureRecord::new(
                    ProcedureOperation::ReturnCall,
                    Stack::new(vec![None; 3]),
                    2045,
                )),
            ],
            &mut buffer,
        )
        .unwrap();

        assert_eq!(
            buffer,
            indoc!(
                // spell-checker: disable
                b"
                call\tbaz\t0
                return\tfoo;bar\t42
                return_call\t;;\t2045
                "
            )
        );
    }
}