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
extern crate slog;
extern crate struct_diff;

use struct_diff::{Diff, Difference};
use slog::{KV, Result, Record, Serializer};

pub struct Differences<'a>(pub Vec<SlogDifference<'a>>);
pub struct SlogDifference<'a>(pub Difference<'a>);

impl<'a> KV for SlogDifference<'a> {

    fn serialize(
        &self,
        _record: &Record,
        serializer: &mut Serializer,
    ) -> Result {
        serializer.emit_str("field", self.0.field.as_str())?;
        serializer.emit_str("left", format!("{:?}", self.0.left).as_str())?;
        serializer.emit_str("right", format!("{:?}", self.0.right).as_str())?;
        Ok(())
    }
}

impl<'a> KV for Differences<'a> {
    fn serialize(
        &self,
        _record: &Record,
        serializer: &mut Serializer,
    ) -> Result {
        for (index, item) in self.0.iter().enumerate() {
            serializer.emit_usize("field_number", index)?;
            item.serialize(_record, serializer)?;
        }
        Ok(())
    }
}