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}