summaryrefslogtreecommitdiffstats
path: root/third_party/rust/time-macros/src/format_description/public/component.rs
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/rust/time-macros/src/format_description/public/component.rs')
-rw-r--r--third_party/rust/time-macros/src/format_description/public/component.rs49
1 files changed, 49 insertions, 0 deletions
diff --git a/third_party/rust/time-macros/src/format_description/public/component.rs b/third_party/rust/time-macros/src/format_description/public/component.rs
new file mode 100644
index 0000000000..4737c6ce5c
--- /dev/null
+++ b/third_party/rust/time-macros/src/format_description/public/component.rs
@@ -0,0 +1,49 @@
+use proc_macro::{Ident, Span, TokenStream};
+
+use super::modifier;
+use crate::to_tokens::ToTokenStream;
+
+macro_rules! declare_component {
+ ($($name:ident)*) => {
+ pub(crate) enum Component {$(
+ $name(modifier::$name),
+ )*}
+
+ impl ToTokenStream for Component {
+ fn append_to(self, ts: &mut TokenStream) {
+ let mut mts = TokenStream::new();
+
+ let component = match self {$(
+ Self::$name(modifier) => {
+ modifier.append_to(&mut mts);
+ stringify!($name)
+ }
+ )*};
+ let component = Ident::new(component, Span::mixed_site());
+
+ quote_append! { ts
+ ::time::format_description::Component::#(component)(#S(mts))
+ }
+ }
+ }
+ };
+}
+
+declare_component! {
+ Day
+ Month
+ Ordinal
+ Weekday
+ WeekNumber
+ Year
+ Hour
+ Minute
+ Period
+ Second
+ Subsecond
+ OffsetHour
+ OffsetMinute
+ OffsetSecond
+ Ignore
+ UnixTimestamp
+}