mail_headers_ng/header_components/
file_meta.rs1
2use chrono::DateTime;
3use chrono::Utc;
4
5use std::mem::replace;
6
7#[cfg(feature="serde")]
8use serde::{Serialize, Deserialize};
9
10#[derive(Debug, Clone, Eq, PartialEq, Hash, Default)]
22#[cfg_attr(feature="serde", derive(Serialize, Deserialize))]
23pub struct FileMeta {
24 #[cfg_attr(feature="serde", serde(default))]
30 pub file_name: Option<String>,
31
32 #[cfg_attr(feature="serde", serde(default))]
34 #[cfg_attr(feature="serde", serde(with = "super::utils::serde::opt_date_time"))]
35 pub creation_date: Option<DateTime<Utc>>,
36
37 #[cfg_attr(feature="serde", serde(default))]
39 #[cfg_attr(feature="serde", serde(with = "super::utils::serde::opt_date_time"))]
40 pub modification_date: Option<DateTime<Utc>>,
41
42 #[cfg_attr(feature="serde", serde(default))]
44 #[cfg_attr(feature="serde", serde(with = "super::utils::serde::opt_date_time"))]
45 pub read_date: Option<DateTime<Utc>>,
46
47 #[cfg_attr(feature="serde", serde(default))]
54 pub size: Option<usize>
55}
56
57macro_rules! impl_replace_none {
58 ($self_:expr, $other:expr, [$($field:ident),*]) => ({
59 let &mut FileMeta {$(
60 ref mut $field
61 ),*} = $self_;
62
63 $(
64 if $field.is_none() {
65 replace($field, $other.$field.clone());
66 }
67 )*
68 })
69}
70
71impl FileMeta {
72
73 pub fn replace_empty_fields_with(&mut self, other_meta: &Self) {
75 impl_replace_none! {
76 self, other_meta,
77 [file_name, creation_date, modification_date, read_date, size]
78 }
79 }
80}