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
use crate::serialize::{Deserialize, Serialize};
use pagurus::{failure::OrFail, Result, System};
use std::{
    io::{Read, Write},
    time::Duration,
};

#[derive(Debug, Default, Clone)]
pub struct AttributesModel {
    pub created_time: Option<Duration>,
    pub updated_time: Option<Duration>,
}

impl AttributesModel {
    pub fn update_time<S: System>(&mut self, system: &mut S) {
        let now = system.clock_unix_time();
        if self.created_time.is_none() {
            self.created_time = Some(now);
        }
        self.updated_time = Some(now);
    }
}

impl Serialize for AttributesModel {
    fn serialize<W: Write>(&self, writer: &mut W) -> Result<()> {
        let mut buf = Vec::new();
        self.created_time.serialize(&mut buf).or_fail()?;
        self.updated_time.serialize(&mut buf).or_fail()?;

        (buf.len() as u16).serialize(writer).or_fail()?;
        writer.write_all(&buf).or_fail()?;
        Ok(())
    }
}

impl Deserialize for AttributesModel {
    fn deserialize<R: Read>(reader: &mut R) -> Result<Self> {
        let size = u16::deserialize(reader).or_fail()?;
        let mut reader = reader.take(size as u64);
        let this = Self {
            created_time: Deserialize::deserialize(&mut reader).or_fail()?,
            updated_time: Deserialize::deserialize(&mut reader).or_fail()?,
        };
        // Ignore unknown fields.
        for _ in reader.bytes() {}
        Ok(this)
    }
}