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