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
37pub fn print<C: Collection + ?Sized, W: Write>(col: &C, mut out: W) -> io::Result<()> {
41 col.visit(&mut PrintVisitor(&mut out));
42 Ok(())
43}