spdlog_internal/pattern_parser/
mod.rs

1use std::borrow::Cow;
2
3use strum::IntoEnumIterator;
4use strum_macros::{EnumDiscriminants, EnumIter, EnumString, IntoStaticStr};
5
6pub mod error;
7mod helper;
8pub mod parse;
9mod registry;
10
11pub use error::{Error, Result};
12pub use registry::{check_custom_pattern_names, PatternRegistry};
13
14#[derive(
15    Clone, Copy, Debug, Eq, PartialEq, IntoStaticStr, EnumDiscriminants, EnumIter, EnumString,
16)]
17#[strum_discriminants(derive(IntoStaticStr))]
18pub enum BuiltInFormatterInner {
19    #[strum(serialize = "weekday_name")]
20    AbbrWeekdayName,
21    #[strum(serialize = "weekday_name_full")]
22    WeekdayName,
23    #[strum(serialize = "month_name")]
24    AbbrMonthName,
25    #[strum(serialize = "month_name_full")]
26    MonthName,
27    #[strum(serialize = "datetime")]
28    FullDateTime,
29    #[strum(serialize = "year_short")]
30    ShortYear,
31    #[strum(serialize = "year")]
32    Year,
33    #[strum(serialize = "date_short")]
34    ShortDate,
35    #[strum(serialize = "date")]
36    Date,
37    #[strum(serialize = "month")]
38    Month,
39    #[strum(serialize = "day")]
40    Day,
41    #[strum(serialize = "hour")]
42    Hour,
43    #[strum(serialize = "hour_12")]
44    Hour12,
45    #[strum(serialize = "minute")]
46    Minute,
47    #[strum(serialize = "second")]
48    Second,
49    #[strum(serialize = "millisecond")]
50    Millisecond,
51    #[strum(serialize = "microsecond")]
52    Microsecond,
53    #[strum(serialize = "nanosecond")]
54    Nanosecond,
55    #[strum(serialize = "am_pm")]
56    AmPm,
57    #[strum(serialize = "time_12")]
58    Time12,
59    #[strum(serialize = "time_short")]
60    ShortTime,
61    #[strum(serialize = "time")]
62    Time,
63    #[strum(serialize = "tz_offset")]
64    TzOffset,
65    #[strum(serialize = "unix_timestamp")]
66    UnixTimestamp,
67    #[strum(serialize = "full")]
68    Full,
69    #[strum(serialize = "level")]
70    Level,
71    #[strum(serialize = "level_short")]
72    ShortLevel,
73    #[strum(serialize = "source")]
74    Source,
75    #[strum(serialize = "file_name")]
76    SourceFilename,
77    #[strum(serialize = "file")]
78    SourceFile,
79    #[strum(serialize = "line")]
80    SourceLine,
81    #[strum(serialize = "column")]
82    SourceColumn,
83    #[strum(serialize = "module_path")]
84    SourceModulePath,
85    #[strum(serialize = "logger")]
86    LoggerName,
87    #[strum(serialize = "payload")]
88    Payload,
89    #[strum(serialize = "pid")]
90    ProcessId,
91    #[strum(serialize = "tid")]
92    ThreadId,
93    #[strum(serialize = "eol")]
94    Eol,
95}
96
97#[derive(Clone, Debug, Eq, PartialEq)]
98pub struct BuiltInFormatter(BuiltInFormatterInner);
99
100impl BuiltInFormatter {
101    pub fn iter() -> impl Iterator<Item = BuiltInFormatter> {
102        BuiltInFormatterInner::iter().map(BuiltInFormatter)
103    }
104
105    pub fn struct_name(&self) -> &'static str {
106        BuiltInFormatterInnerDiscriminants::from(self.0).into()
107    }
108
109    pub fn placeholder(&self) -> &'static str {
110        self.0.into()
111    }
112
113    pub fn inner(&self) -> BuiltInFormatterInner {
114        self.0
115    }
116}
117
118#[derive(Clone, Debug, Eq, PartialEq)]
119pub enum PatternKind<F> {
120    BuiltIn(BuiltInFormatter),
121    Custom {
122        placeholder: Cow<'static, str>,
123        factory: F,
124    },
125}
126
127impl<F> PatternKind<F> {
128    pub(crate) fn placeholder(&self) -> &str {
129        match self {
130            PatternKind::BuiltIn(f) => f.placeholder(),
131            PatternKind::Custom { placeholder, .. } => placeholder,
132        }
133    }
134
135    pub(crate) fn to_factory_erased(&self) -> PatternKind<()> {
136        match self {
137            PatternKind::BuiltIn(b) => PatternKind::BuiltIn(b.clone()),
138            PatternKind::Custom { placeholder, .. } => PatternKind::Custom {
139                placeholder: placeholder.clone(),
140                factory: (),
141            },
142        }
143    }
144}