log4rs_rolling_file/policy/compound/trigger/size/
mod.rs

1//! The size trigger.
2
3use log4rs::file::{Deserialize, Deserializers};
4use serde_value::Value;
5use std::error::Error;
6
7use LogFile;
8use policy::compound::trigger::Trigger;
9use policy::compound::trigger::size::config::Config;
10
11#[cfg_attr(rustfmt, rustfmt_skip)]
12mod config;
13
14/// A trigger which rolls the log once it has passed a certain size.
15#[derive(Debug)]
16pub struct SizeTrigger {
17    limit: u64,
18}
19
20impl SizeTrigger {
21    /// Returns a new trigger which rolls the log once it has passed the
22    /// specified size in bytes.
23    pub fn new(limit: u64) -> SizeTrigger {
24        SizeTrigger { limit: limit }
25    }
26}
27
28impl Trigger for SizeTrigger {
29    fn trigger(&self, file: &LogFile) -> Result<bool, Box<Error>> {
30        Ok(file.len() > self.limit)
31    }
32}
33
34/// A deserializer for the `SizeTrigger`.
35///
36/// # Configuration
37///
38/// ```yaml
39/// kind: size
40///
41/// # The size limit in bytes. The following units are supported (case insensitive):
42/// # "b", "kb", "kib", "mb", "mib", "gb", "gib", "tb", "tib". The unit defaults to
43/// # bytes if not specified. Required.
44/// limit: 10 mb
45/// ```
46pub struct SizeTriggerDeserializer;
47
48impl Deserialize for SizeTriggerDeserializer {
49    type Trait = Trigger;
50
51    fn deserialize(&self, config: Value, _: &Deserializers) -> Result<Box<Trigger>, Box<Error>> {
52        let config: Config = try!(config.deserialize_into());
53        Ok(Box::new(SizeTrigger::new(config.limit)))
54    }
55}