1use crate::{Key, StringValue};
2
3use crate::{SpanId, TraceFlags, TraceId};
4
5use std::{borrow::Cow, collections::HashMap, time::SystemTime};
6
7pub trait LogRecord {
9 fn set_event_name(&mut self, name: &'static str);
11
12 fn set_target<T>(&mut self, _target: T)
17 where
18 T: Into<Cow<'static, str>>;
19
20 fn set_timestamp(&mut self, timestamp: SystemTime);
22
23 fn set_observed_timestamp(&mut self, timestamp: SystemTime);
25
26 fn set_severity_text(&mut self, text: &'static str);
28
29 fn set_severity_number(&mut self, number: Severity);
31
32 fn set_body(&mut self, body: AnyValue);
34
35 fn add_attributes<I, K, V>(&mut self, attributes: I)
37 where
38 I: IntoIterator<Item = (K, V)>,
39 K: Into<Key>,
40 V: Into<AnyValue>;
41
42 fn add_attribute<K, V>(&mut self, key: K, value: V)
44 where
45 K: Into<Key>,
46 V: Into<AnyValue>;
47
48 fn set_trace_context(
50 &mut self,
51 trace_id: TraceId,
52 span_id: SpanId,
53 trace_flags: Option<TraceFlags>,
54 ) {
55 let _ = trace_id;
56 let _ = span_id;
57 let _ = trace_flags;
58 }
59}
60
61#[derive(Debug, Clone, PartialEq)]
71#[non_exhaustive]
72pub enum AnyValue {
73 Int(i64),
75 Double(f64),
77 String(StringValue),
79 Boolean(bool),
81 Bytes(Box<Vec<u8>>),
83 ListAny(Box<Vec<AnyValue>>),
85 Map(Box<HashMap<Key, AnyValue>>),
87}
88
89macro_rules! impl_trivial_from {
90 ($t:ty, $variant:path) => {
91 impl From<$t> for AnyValue {
92 fn from(val: $t) -> AnyValue {
93 $variant(val.into())
94 }
95 }
96 };
97}
98
99impl_trivial_from!(i8, AnyValue::Int);
100impl_trivial_from!(i16, AnyValue::Int);
101impl_trivial_from!(i32, AnyValue::Int);
102impl_trivial_from!(i64, AnyValue::Int);
103
104impl_trivial_from!(u8, AnyValue::Int);
105impl_trivial_from!(u16, AnyValue::Int);
106impl_trivial_from!(u32, AnyValue::Int);
107
108impl_trivial_from!(f64, AnyValue::Double);
109impl_trivial_from!(f32, AnyValue::Double);
110
111impl_trivial_from!(String, AnyValue::String);
112impl_trivial_from!(Cow<'static, str>, AnyValue::String);
113impl_trivial_from!(&'static str, AnyValue::String);
114impl_trivial_from!(StringValue, AnyValue::String);
115
116impl_trivial_from!(bool, AnyValue::Boolean);
117
118impl From<&[u8]> for AnyValue {
119 fn from(val: &[u8]) -> AnyValue {
120 AnyValue::Bytes(Box::new(val.to_vec()))
121 }
122}
123
124impl<T: Into<AnyValue>> FromIterator<T> for AnyValue {
125 fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
127 AnyValue::ListAny(Box::new(iter.into_iter().map(Into::into).collect()))
128 }
129}
130
131impl<K: Into<Key>, V: Into<AnyValue>> FromIterator<(K, V)> for AnyValue {
132 fn from_iter<I: IntoIterator<Item = (K, V)>>(iter: I) -> Self {
135 AnyValue::Map(Box::new(HashMap::from_iter(
136 iter.into_iter().map(|(k, v)| (k.into(), v.into())),
137 )))
138 }
139}
140
141#[derive(Debug, Copy, Clone, PartialEq, Eq, Ord, PartialOrd)]
143pub enum Severity {
144 Trace = 1,
146 Trace2 = 2,
148 Trace3 = 3,
150 Trace4 = 4,
152 Debug = 5,
154 Debug2 = 6,
156 Debug3 = 7,
158 Debug4 = 8,
160 Info = 9,
162 Info2 = 10,
164 Info3 = 11,
166 Info4 = 12,
168 Warn = 13,
170 Warn2 = 14,
172 Warn3 = 15,
174 Warn4 = 16,
176 Error = 17,
178 Error2 = 18,
180 Error3 = 19,
182 Error4 = 20,
184 Fatal = 21,
186 Fatal2 = 22,
188 Fatal3 = 23,
190 Fatal4 = 24,
192}
193
194impl Severity {
195 pub const fn name(&self) -> &'static str {
198 match &self {
199 Severity::Trace => "TRACE",
200 Severity::Trace2 => "TRACE2",
201 Severity::Trace3 => "TRACE3",
202 Severity::Trace4 => "TRACE4",
203
204 Severity::Debug => "DEBUG",
205 Severity::Debug2 => "DEBUG2",
206 Severity::Debug3 => "DEBUG3",
207 Severity::Debug4 => "DEBUG4",
208
209 Severity::Info => "INFO",
210 Severity::Info2 => "INFO2",
211 Severity::Info3 => "INFO3",
212 Severity::Info4 => "INFO4",
213
214 Severity::Warn => "WARN",
215 Severity::Warn2 => "WARN2",
216 Severity::Warn3 => "WARN3",
217 Severity::Warn4 => "WARN4",
218
219 Severity::Error => "ERROR",
220 Severity::Error2 => "ERROR2",
221 Severity::Error3 => "ERROR3",
222 Severity::Error4 => "ERROR4",
223
224 Severity::Fatal => "FATAL",
225 Severity::Fatal2 => "FATAL2",
226 Severity::Fatal3 => "FATAL3",
227 Severity::Fatal4 => "FATAL4",
228 }
229 }
230}