libcantal/
print.rs

1use std::fmt;
2use std::io::{self, Write};
3
4use collection::{Collection, Visitor};
5
6use name::{Name, NameVisitor};
7use value::Value;
8
9
10struct PrintVisitor<'a, W: Write + ?Sized + 'a>(&'a mut W);
11
12struct NameFormatter<'a, N: Name + ?Sized + 'a>(&'a N);
13struct FmtVisitor<'a: 'b, 'b>(fmt::DebugMap<'b, 'a>);
14
15impl<'a, 'b> NameVisitor for FmtVisitor<'a, 'b> {
16    fn visit_pair(&mut self, key: &str, value: &str) {
17        self.0.entry(&key, &value);
18    }
19}
20
21impl<'a, N: Name + ?Sized + 'a> fmt::Display for NameFormatter<'a, N> {
22    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
23        let mut s = FmtVisitor(f.debug_map());
24        self.0.visit(&mut s);
25        s.0.finish()
26    }
27}
28
29
30impl<'a, 'b, W: Write + 'a> Visitor<'b> for PrintVisitor<'a, W> {
31    fn metric(&mut self, name: &Name, value: &Value)
32    {
33        println!("{} {}", NameFormatter(name), value);
34    }
35}
36
37/// Print all metrics of a collection to a file
38///
39/// Useful mostly for debugging
40pub fn print<C: Collection + ?Sized, W: Write>(col: &C, mut out: W) -> io::Result<()> {
41    col.visit(&mut PrintVisitor(&mut out));
42    Ok(())
43}