tracing_subscriber/fmt/time/
chrono_crate.rs1use crate::fmt::format::Writer;
2use crate::fmt::time::FormatTime;
3
4use std::sync::Arc;
5
6#[cfg_attr(docsrs, doc(cfg(feature = "chrono")))]
18#[derive(Debug, Clone, Eq, PartialEq, Default)]
19pub struct ChronoLocal {
20 format: Arc<ChronoFmtType>,
21}
22
23impl ChronoLocal {
24 pub fn rfc_3339() -> Self {
30 Self {
31 format: Arc::new(ChronoFmtType::Rfc3339),
32 }
33 }
34
35 pub fn new(format_string: String) -> Self {
39 Self {
40 format: Arc::new(ChronoFmtType::Custom(format_string)),
41 }
42 }
43}
44
45impl FormatTime for ChronoLocal {
46 fn format_time(&self, w: &mut Writer<'_>) -> alloc::fmt::Result {
47 let t = chrono::Local::now();
48 match self.format.as_ref() {
49 ChronoFmtType::Rfc3339 => {
50 use chrono::format::{Fixed, Item};
51 write!(
52 w,
53 "{}",
54 t.format_with_items(core::iter::once(Item::Fixed(Fixed::RFC3339)))
55 )
56 }
57 ChronoFmtType::Custom(fmt) => {
58 write!(w, "{}", t.format(fmt))
59 }
60 }
61 }
62}
63
64#[cfg_attr(docsrs, doc(cfg(feature = "chrono")))]
69#[derive(Debug, Clone, Eq, PartialEq, Default)]
70pub struct ChronoUtc {
71 format: Arc<ChronoFmtType>,
72}
73
74impl ChronoUtc {
75 pub fn rfc_3339() -> Self {
81 Self {
82 format: Arc::new(ChronoFmtType::Rfc3339),
83 }
84 }
85
86 pub fn new(format_string: String) -> Self {
90 Self {
91 format: Arc::new(ChronoFmtType::Custom(format_string)),
92 }
93 }
94}
95
96impl FormatTime for ChronoUtc {
97 fn format_time(&self, w: &mut Writer<'_>) -> alloc::fmt::Result {
98 let t = chrono::Utc::now();
99 match self.format.as_ref() {
100 ChronoFmtType::Rfc3339 => w.write_str(&t.to_rfc3339()),
101 ChronoFmtType::Custom(fmt) => w.write_str(&format!("{}", t.format(fmt))),
102 }
103 }
104}
105
106#[derive(Debug, Clone, Eq, PartialEq)]
112#[derive(Default)]
113enum ChronoFmtType {
114 #[default]
116 Rfc3339,
117 Custom(String),
119}
120
121
122#[cfg(test)]
123mod tests {
124 use crate::fmt::format::Writer;
125 use crate::fmt::time::FormatTime;
126
127 use std::sync::Arc;
128
129 use super::ChronoFmtType;
130 use super::ChronoLocal;
131 use super::ChronoUtc;
132
133 #[test]
134 fn test_chrono_format_time_utc_default() {
135 let mut buf = String::new();
136 let mut dst: Writer<'_> = Writer::new(&mut buf);
137 assert!(FormatTime::format_time(&ChronoUtc::default(), &mut dst).is_ok());
138 assert!(chrono::DateTime::parse_from_str(&buf, "%FT%H:%M:%S%.6f%z").is_ok());
140 }
141
142 #[test]
143 fn test_chrono_format_time_utc_custom() {
144 let fmt = ChronoUtc {
145 format: Arc::new(ChronoFmtType::Custom("%a %b %e %T %Y".to_owned())),
146 };
147 let mut buf = String::new();
148 let mut dst: Writer<'_> = Writer::new(&mut buf);
149 assert!(FormatTime::format_time(&fmt, &mut dst).is_ok());
150 assert!(chrono::NaiveDateTime::parse_from_str(&buf, "%a %b %e %T %Y").is_ok());
152 }
153
154 #[test]
155 fn test_chrono_format_time_local_default() {
156 let mut buf = String::new();
157 let mut dst: Writer<'_> = Writer::new(&mut buf);
158 assert!(FormatTime::format_time(&ChronoLocal::default(), &mut dst).is_ok());
159 assert!(chrono::DateTime::parse_from_str(&buf, "%FT%H:%M:%S%.6f%z").is_ok());
161 }
162
163 #[test]
164 fn test_chrono_format_time_local_custom() {
165 let fmt = ChronoLocal {
166 format: Arc::new(ChronoFmtType::Custom("%a %b %e %T %Y".to_owned())),
167 };
168 let mut buf = String::new();
169 let mut dst: Writer<'_> = Writer::new(&mut buf);
170 assert!(FormatTime::format_time(&fmt, &mut dst).is_ok());
171 assert!(chrono::NaiveDateTime::parse_from_str(&buf, "%a %b %e %T %Y").is_ok());
173 }
174}