1#![doc(
151 html_logo_url = "https://raw.githubusercontent.com/tokio-rs/tracing/master/assets/logo-type.png",
152 html_favicon_url = "https://raw.githubusercontent.com/tokio-rs/tracing/master/assets/favicon.ico",
153 issue_tracker_base_url = "https://github.com/tokio-rs/tracing/issues/"
154)]
155#![warn(
156 missing_debug_implementations,
157 rust_2018_idioms,
159 unreachable_pub,
160 bad_style,
161 dead_code,
162 improper_ctypes,
163 non_shorthand_field_patterns,
164 no_mangle_generic_items,
165 overflowing_literals,
166 path_statements,
167 patterns_in_fns_without_body,
168 private_interfaces,
169 private_bounds,
170 unconditional_recursion,
171 unused,
172 unused_allocation,
173 unused_comparisons,
174 unused_parens,
175 while_true
176)]
177#![cfg_attr(not(feature = "std"), no_std)]
179
180use core::fmt;
181
182use serde::{
183 ser::{SerializeMap, SerializeSeq, SerializeStruct, SerializeTupleStruct, Serializer},
184 Serialize,
185};
186
187use tracing_core::{
188 event::Event,
189 field::{Field, FieldSet, Visit},
190 metadata::{Level, Metadata},
191 span::{Attributes, Id, Record},
192};
193
194pub mod fields;
195
196#[derive(Debug)]
197pub struct SerializeField<'a>(&'a Field);
198
199impl Serialize for SerializeField<'_> {
200 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
201 where
202 S: Serializer,
203 {
204 serializer.serialize_str(self.0.name())
205 }
206}
207
208#[derive(Debug)]
209pub struct SerializeFieldSet<'a>(&'a FieldSet);
210
211impl Serialize for SerializeFieldSet<'_> {
212 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
213 where
214 S: Serializer,
215 {
216 let mut seq = serializer.serialize_seq(Some(self.0.len()))?;
217 for element in self.0 {
218 seq.serialize_element(&SerializeField(&element))?;
219 }
220 seq.end()
221 }
222}
223
224#[derive(Debug)]
225pub struct SerializeLevel<'a>(&'a Level);
226
227impl Serialize for SerializeLevel<'_> {
228 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
229 where
230 S: Serializer,
231 {
232 if self.0 == &Level::ERROR {
233 serializer.serialize_str("ERROR")
234 } else if self.0 == &Level::WARN {
235 serializer.serialize_str("WARN")
236 } else if self.0 == &Level::INFO {
237 serializer.serialize_str("INFO")
238 } else if self.0 == &Level::DEBUG {
239 serializer.serialize_str("DEBUG")
240 } else if self.0 == &Level::TRACE {
241 serializer.serialize_str("TRACE")
242 } else {
243 unreachable!()
244 }
245 }
246}
247
248#[derive(Debug)]
249pub struct SerializeId<'a>(&'a Id);
250
251impl Serialize for SerializeId<'_> {
252 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
253 where
254 S: Serializer,
255 {
256 let mut state = serializer.serialize_tuple_struct("Id", 1)?;
257 state.serialize_field(&self.0.into_u64())?;
258 state.end()
259 }
260}
261
262#[derive(Debug)]
263pub struct SerializeMetadata<'a>(&'a Metadata<'a>);
264
265impl Serialize for SerializeMetadata<'_> {
266 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
267 where
268 S: Serializer,
269 {
270 let mut state = serializer.serialize_struct("Metadata", 9)?;
271 state.serialize_field("name", self.0.name())?;
272 state.serialize_field("target", self.0.target())?;
273 state.serialize_field("level", &SerializeLevel(self.0.level()))?;
274 state.serialize_field("module_path", &self.0.module_path())?;
275 state.serialize_field("file", &self.0.file())?;
276 state.serialize_field("line", &self.0.line())?;
277 state.serialize_field("fields", &SerializeFieldSet(self.0.fields()))?;
278 state.serialize_field("is_span", &self.0.is_span())?;
279 state.serialize_field("is_event", &self.0.is_event())?;
280 state.end()
281 }
282}
283
284#[derive(Debug)]
286pub struct SerializeEvent<'a>(&'a Event<'a>);
287
288impl Serialize for SerializeEvent<'_> {
289 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
290 where
291 S: Serializer,
292 {
293 let mut serializer = serializer.serialize_struct("Event", 2)?;
294 serializer.serialize_field("metadata", &SerializeMetadata(self.0.metadata()))?;
295 let mut visitor = SerdeStructVisitor {
296 serializer,
297 state: Ok(()),
298 };
299 self.0.record(&mut visitor);
300 visitor.finish()
301 }
302}
303
304#[derive(Debug)]
306pub struct SerializeAttributes<'a>(&'a Attributes<'a>);
307
308impl Serialize for SerializeAttributes<'_> {
309 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
310 where
311 S: Serializer,
312 {
313 let mut serializer = serializer.serialize_struct("Attributes", 3)?;
314 serializer.serialize_field("metadata", &SerializeMetadata(self.0.metadata()))?;
315 serializer.serialize_field("parent", &self.0.parent().map(SerializeId))?;
316 serializer.serialize_field("is_root", &self.0.is_root())?;
317
318 let mut visitor = SerdeStructVisitor {
319 serializer,
320 state: Ok(()),
321 };
322 self.0.record(&mut visitor);
323 visitor.finish()
324 }
325}
326
327#[derive(Debug)]
329pub struct SerializeRecord<'a>(&'a Record<'a>);
330
331impl Serialize for SerializeRecord<'_> {
332 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
333 where
334 S: Serializer,
335 {
336 let serializer = serializer.serialize_map(None)?;
337 let mut visitor = SerdeMapVisitor::new(serializer);
338 self.0.record(&mut visitor);
339 visitor.finish()
340 }
341}
342
343#[derive(Debug)]
345pub struct SerdeMapVisitor<S: SerializeMap> {
346 serializer: S,
347 state: Result<(), S::Error>,
348}
349
350impl<S> SerdeMapVisitor<S>
351where
352 S: SerializeMap,
353{
354 pub fn new(serializer: S) -> Self {
356 Self {
357 serializer,
358 state: Ok(()),
359 }
360 }
361
362 pub fn finish(self) -> Result<S::Ok, S::Error> {
366 self.state?;
367 self.serializer.end()
368 }
369
370 pub fn take_serializer(self) -> Result<S, S::Error> {
374 self.state?;
375 Ok(self.serializer)
376 }
377}
378
379impl<S> Visit for SerdeMapVisitor<S>
380where
381 S: SerializeMap,
382{
383 fn record_bool(&mut self, field: &Field, value: bool) {
384 if self.state.is_ok() {
387 self.state = self.serializer.serialize_entry(field.name(), &value)
388 }
389 }
390
391 fn record_debug(&mut self, field: &Field, value: &dyn fmt::Debug) {
392 if self.state.is_ok() {
393 self.state = self
394 .serializer
395 .serialize_entry(field.name(), &format_args!("{:?}", value))
396 }
397 }
398
399 fn record_u64(&mut self, field: &Field, value: u64) {
400 if self.state.is_ok() {
401 self.state = self.serializer.serialize_entry(field.name(), &value)
402 }
403 }
404
405 fn record_i64(&mut self, field: &Field, value: i64) {
406 if self.state.is_ok() {
407 self.state = self.serializer.serialize_entry(field.name(), &value)
408 }
409 }
410
411 fn record_f64(&mut self, field: &Field, value: f64) {
412 if self.state.is_ok() {
413 self.state = self.serializer.serialize_entry(field.name(), &value)
414 }
415 }
416
417 fn record_str(&mut self, field: &Field, value: &str) {
418 if self.state.is_ok() {
419 self.state = self.serializer.serialize_entry(field.name(), &value)
420 }
421 }
422}
423
424#[derive(Debug)]
426pub struct SerdeStructVisitor<S: SerializeStruct> {
427 serializer: S,
428 state: Result<(), S::Error>,
429}
430
431impl<S> Visit for SerdeStructVisitor<S>
432where
433 S: SerializeStruct,
434{
435 fn record_bool(&mut self, field: &Field, value: bool) {
436 if self.state.is_ok() {
439 self.state = self.serializer.serialize_field(field.name(), &value)
440 }
441 }
442
443 fn record_debug(&mut self, field: &Field, value: &dyn fmt::Debug) {
444 if self.state.is_ok() {
445 self.state = self
446 .serializer
447 .serialize_field(field.name(), &format_args!("{:?}", value))
448 }
449 }
450
451 fn record_u64(&mut self, field: &Field, value: u64) {
452 if self.state.is_ok() {
453 self.state = self.serializer.serialize_field(field.name(), &value)
454 }
455 }
456
457 fn record_i64(&mut self, field: &Field, value: i64) {
458 if self.state.is_ok() {
459 self.state = self.serializer.serialize_field(field.name(), &value)
460 }
461 }
462
463 fn record_f64(&mut self, field: &Field, value: f64) {
464 if self.state.is_ok() {
465 self.state = self.serializer.serialize_field(field.name(), &value)
466 }
467 }
468
469 fn record_str(&mut self, field: &Field, value: &str) {
470 if self.state.is_ok() {
471 self.state = self.serializer.serialize_field(field.name(), &value)
472 }
473 }
474}
475
476impl<S: SerializeStruct> SerdeStructVisitor<S> {
477 pub fn finish(self) -> Result<S::Ok, S::Error> {
481 self.state?;
482 self.serializer.end()
483 }
484}
485
486pub trait AsSerde<'a>: self::sealed::Sealed {
487 type Serializable: serde::Serialize + 'a;
488
489 fn as_serde(&'a self) -> Self::Serializable;
491}
492
493impl<'a> AsSerde<'a> for tracing_core::Metadata<'a> {
494 type Serializable = SerializeMetadata<'a>;
495
496 fn as_serde(&'a self) -> Self::Serializable {
497 SerializeMetadata(self)
498 }
499}
500
501impl<'a> AsSerde<'a> for tracing_core::Event<'a> {
502 type Serializable = SerializeEvent<'a>;
503
504 fn as_serde(&'a self) -> Self::Serializable {
505 SerializeEvent(self)
506 }
507}
508
509impl<'a> AsSerde<'a> for tracing_core::span::Attributes<'a> {
510 type Serializable = SerializeAttributes<'a>;
511
512 fn as_serde(&'a self) -> Self::Serializable {
513 SerializeAttributes(self)
514 }
515}
516
517impl<'a> AsSerde<'a> for tracing_core::span::Id {
518 type Serializable = SerializeId<'a>;
519
520 fn as_serde(&'a self) -> Self::Serializable {
521 SerializeId(self)
522 }
523}
524
525impl<'a> AsSerde<'a> for tracing_core::span::Record<'a> {
526 type Serializable = SerializeRecord<'a>;
527
528 fn as_serde(&'a self) -> Self::Serializable {
529 SerializeRecord(self)
530 }
531}
532
533impl<'a> AsSerde<'a> for Level {
534 type Serializable = SerializeLevel<'a>;
535
536 fn as_serde(&'a self) -> Self::Serializable {
537 SerializeLevel(self)
538 }
539}
540
541impl<'a> AsSerde<'a> for Field {
542 type Serializable = SerializeField<'a>;
543
544 fn as_serde(&'a self) -> Self::Serializable {
545 SerializeField(self)
546 }
547}
548
549impl<'a> AsSerde<'a> for FieldSet {
550 type Serializable = SerializeFieldSet<'a>;
551
552 fn as_serde(&'a self) -> Self::Serializable {
553 SerializeFieldSet(self)
554 }
555}
556
557impl self::sealed::Sealed for Event<'_> {}
558
559impl self::sealed::Sealed for Attributes<'_> {}
560
561impl self::sealed::Sealed for Id {}
562
563impl self::sealed::Sealed for Level {}
564
565impl self::sealed::Sealed for Record<'_> {}
566
567impl self::sealed::Sealed for Metadata<'_> {}
568
569impl self::sealed::Sealed for Field {}
570
571impl self::sealed::Sealed for FieldSet {}
572
573mod sealed {
574 pub trait Sealed {}
575}