| //! Structured data associated with `Span`s and `Event`s. |
| pub use tracing_core::field::*; |
| |
| use crate::Metadata; |
| |
| /// Trait implemented to allow a type to be used as a field key. |
| /// |
| /// **Note**: Although this is implemented for both the [`Field`] type *and* any |
| /// type that can be borrowed as an `&str`, only `Field` allows _O_(1) access. |
| /// Indexing a field with a string results in an iterative search that performs |
| /// string comparisons. Thus, if possible, once the key for a field is known, it |
| /// should be used whenever possible. |
| /// |
| /// [`Field`]: ./struct.Field.html |
| pub trait AsField: crate::sealed::Sealed { |
| /// Attempts to convert `&self` into a `Field` with the specified `metadata`. |
| /// |
| /// If `metadata` defines this field, then the field is returned. Otherwise, |
| /// this returns `None`. |
| fn as_field(&self, metadata: &Metadata<'_>) -> Option<Field>; |
| } |
| |
| // ===== impl AsField ===== |
| |
| impl AsField for Field { |
| #[inline] |
| fn as_field(&self, metadata: &Metadata<'_>) -> Option<Field> { |
| if self.callsite() == metadata.callsite() { |
| Some(self.clone()) |
| } else { |
| None |
| } |
| } |
| } |
| |
| impl<'a> AsField for &'a Field { |
| #[inline] |
| fn as_field(&self, metadata: &Metadata<'_>) -> Option<Field> { |
| if self.callsite() == metadata.callsite() { |
| Some((*self).clone()) |
| } else { |
| None |
| } |
| } |
| } |
| |
| impl AsField for str { |
| #[inline] |
| fn as_field(&self, metadata: &Metadata<'_>) -> Option<Field> { |
| metadata.fields().field(&self) |
| } |
| } |
| |
| impl crate::sealed::Sealed for Field {} |
| impl<'a> crate::sealed::Sealed for &'a Field {} |
| impl crate::sealed::Sealed for str {} |