1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114
//! Provides formatters for sink formatting log records.
//!
//! Usually use [`Sink::set_formatter`] to set the formatter of a sink.
//!
//! [`Sink::set_formatter`]: crate::sink::Sink::set_formatter
mod full_formatter;
#[cfg(any(
all(target_os = "linux", feature = "native", feature = "libsystemd"),
all(doc, not(doctest))
))]
mod journald_formatter;
mod local_time_cacher;
mod pattern_formatter;
use std::ops::Range;
pub use full_formatter::*;
#[cfg(any(
all(target_os = "linux", feature = "native", feature = "libsystemd"),
all(doc, not(doctest))
))]
pub(crate) use journald_formatter::*;
pub(crate) use local_time_cacher::*;
pub use pattern_formatter::*;
use crate::{Record, Result, StringBuf};
/// A trait for log records formatters.
///
/// # Examples
///
/// See the implementation of [`FullFormatter`] and [./examples] directory.
///
/// [./examples]: https://github.com/SpriteOvO/spdlog-rs/tree/main/spdlog/examples
pub trait Formatter: Send + Sync {
/// Formats a log record.
fn format(&self, record: &Record, dest: &mut StringBuf) -> Result<FmtExtraInfo>;
/// Clones self into a boxed trait object.
#[must_use]
fn clone_box(&self) -> Box<dyn Formatter>;
}
/// Extra information for formatted text.
#[derive(Clone, Eq, PartialEq, Hash, Debug, Default)]
pub struct FmtExtraInfo {
style_range: Option<Range<usize>>,
}
impl FmtExtraInfo {
/// Constructs a `FmtExtraInfo`.
#[must_use]
pub fn new() -> FmtExtraInfo {
FmtExtraInfo::default()
}
/// Constructs a [`FmtExtraInfoBuilder`].
#[must_use]
pub fn builder() -> FmtExtraInfoBuilder {
FmtExtraInfoBuilder::new()
}
/// A style range (in bytes) of the formatted text.
///
/// If style is available in the sink, the text in the range will be
/// rendered in the style corresponding to that log message level, otherwise
/// it will be ignored.
///
/// Its indexes are guaranteed by the setter to be the correct UTF-8
/// boundary.
#[must_use]
pub fn style_range(&self) -> Option<Range<usize>> {
self.style_range.clone() // This clone is cheap
}
}
/// The builder of [`FmtExtraInfo`].
///
/// # Examples
///
/// See the implementation of [`FullFormatter`] and [./examples] directory.
///
/// [./examples]: https://github.com/SpriteOvO/spdlog-rs/tree/main/spdlog/examples
#[derive(Clone, Eq, PartialEq, Hash, Debug, Default)]
pub struct FmtExtraInfoBuilder {
info: FmtExtraInfo,
}
impl FmtExtraInfoBuilder {
/// Constructs a `FmtExtraInfoBuilder`.
///
/// The default value of [`FmtExtraInfo`] is the same as
/// [`FmtExtraInfo::new`].
#[must_use]
pub fn new() -> Self {
Self::default()
}
/// Sets style range (in bytes) of the formatted text.
///
/// Users must ensure that indexes are correctly UTF-8 boundary.
#[must_use]
pub fn style_range(mut self, range: Range<usize>) -> Self {
self.info.style_range = Some(range);
self
}
/// Builds a [`FmtExtraInfo`].
#[must_use]
pub fn build(self) -> FmtExtraInfo {
self.info
}
}