events-macros: Get rid of lots of unwrapping

This commit is contained in:
Jonas Platte 2021-10-07 00:13:57 +02:00
parent 9103ad74bb
commit fd15dcda9f
No known key found for this signature in database
GPG Key ID: CC154DE0E30B7C67
4 changed files with 39 additions and 34 deletions

View File

@ -416,9 +416,9 @@ fn expand_redact_event(
) -> TokenStream { ) -> TokenStream {
let ruma_identifiers = quote! { #ruma_events::exports::ruma_identifiers }; let ruma_identifiers = quote! { #ruma_events::exports::ruma_identifiers };
let redacted_type = kind.to_event_ident(var.to_redacted().unwrap()).unwrap(); let redacted_type = kind.to_event_ident(var.to_redacted());
let redacted_content_trait = let redacted_content_trait =
format_ident!("{}Content", kind.to_event_ident(EventKindVariation::Redacted).unwrap()); format_ident!("{}Content", kind.to_event_ident(EventKindVariation::Redacted));
let ident = &input.ident; let ident = &input.ident;
let mut generics = input.generics.clone(); let mut generics = input.generics.clone();
@ -489,7 +489,7 @@ fn expand_sync_from_into_full(
let ruma_identifiers = quote! { #ruma_events::exports::ruma_identifiers }; let ruma_identifiers = quote! { #ruma_events::exports::ruma_identifiers };
let ident = &input.ident; let ident = &input.ident;
let full_struct = kind.to_event_ident(var.to_full().unwrap()).unwrap(); let full_struct = kind.to_event_ident(var.to_full());
let (impl_generics, ty_gen, where_clause) = input.generics.split_for_impl(); let (impl_generics, ty_gen, where_clause) = input.generics.split_for_impl();
let fields: Vec<_> = fields.iter().flat_map(|f| &f.ident).collect(); let fields: Vec<_> = fields.iter().flat_map(|f| &f.ident).collect();

View File

@ -350,7 +350,7 @@ fn generate_event_type_aliases(
EventKindVariation::RedactedSync, EventKindVariation::RedactedSync,
] ]
.iter() .iter()
.filter_map(|&kind| Some((kind, event_kind.to_event_ident(kind)?))) .filter_map(|&kind| Some((kind, event_kind.try_to_event_ident(kind)?)))
.map(|(kind, ev_struct)| { .map(|(kind, ev_struct)| {
let ev_type = format_ident!("{}{}", kind, ev_type_s); let ev_type = format_ident!("{}{}", kind, ev_type_s);

View File

@ -65,8 +65,8 @@ fn expand_event_enum(
) -> TokenStream { ) -> TokenStream {
let serde = quote! { #ruma_events::exports::serde }; let serde = quote! { #ruma_events::exports::serde };
let event_struct = kind.to_event_ident(var).unwrap(); let event_struct = kind.to_event_ident(var);
let ident = kind.to_event_enum_ident(var).unwrap(); let ident = kind.to_event_enum_ident(var);
let variant_decls = variants.iter().map(|v| v.decl()); let variant_decls = variants.iter().map(|v| v.decl());
let content: Vec<_> = let content: Vec<_> =
@ -121,8 +121,8 @@ fn expand_deserialize_impl(
let serde = quote! { #ruma_events::exports::serde }; let serde = quote! { #ruma_events::exports::serde };
let serde_json = quote! { #ruma_events::exports::serde_json }; let serde_json = quote! { #ruma_events::exports::serde_json };
let ident = kind.to_event_enum_ident(var).unwrap(); let ident = kind.to_event_enum_ident(var);
let event_struct = kind.to_event_ident(var).unwrap(); let event_struct = kind.to_event_ident(var);
let variant_attrs = variants.iter().map(|v| { let variant_attrs = variants.iter().map(|v| {
let attrs = &v.attrs; let attrs = &v.attrs;
@ -211,8 +211,8 @@ fn expand_from_full_event(
var: EventKindVariation, var: EventKindVariation,
variants: &[EventEnumVariant], variants: &[EventEnumVariant],
) -> TokenStream { ) -> TokenStream {
let ident = kind.to_event_enum_ident(var).unwrap(); let ident = kind.to_event_enum_ident(var);
let sync = kind.to_event_enum_ident(var.to_sync().unwrap()).unwrap(); let sync = kind.to_event_enum_ident(var.to_sync());
let ident_variants = variants.iter().map(|v| v.match_arm(&ident)); let ident_variants = variants.iter().map(|v| v.match_arm(&ident));
let self_variants = variants.iter().map(|v| v.ctor(quote! { Self })); let self_variants = variants.iter().map(|v| v.ctor(quote! { Self }));
@ -244,8 +244,8 @@ fn expand_into_full_event(
) -> TokenStream { ) -> TokenStream {
let ruma_identifiers = quote! { #ruma_events::exports::ruma_identifiers }; let ruma_identifiers = quote! { #ruma_events::exports::ruma_identifiers };
let ident = kind.to_event_enum_ident(var).unwrap(); let ident = kind.to_event_enum_ident(var);
let full = kind.to_event_enum_ident(var.to_full().unwrap()).unwrap(); let full = kind.to_event_enum_ident(var.to_full());
let self_variants = variants.iter().map(|v| v.match_arm(quote! { Self })); let self_variants = variants.iter().map(|v| v.match_arm(quote! { Self }));
let full_variants = variants.iter().map(|v| v.ctor(&full)); let full_variants = variants.iter().map(|v| v.ctor(&full));
@ -361,8 +361,8 @@ fn expand_redact(
) -> TokenStream { ) -> TokenStream {
let ruma_identifiers = quote! { #ruma_events::exports::ruma_identifiers }; let ruma_identifiers = quote! { #ruma_events::exports::ruma_identifiers };
let ident = kind.to_event_enum_ident(var).unwrap(); let ident = kind.to_event_enum_ident(var);
let redacted_enum = kind.to_event_enum_ident(var.to_redacted().unwrap()).unwrap(); let redacted_enum = kind.to_event_enum_ident(var.to_redacted());
let self_variants = variants.iter().map(|v| v.match_arm(quote! { Self })); let self_variants = variants.iter().map(|v| v.match_arm(quote! { Self }));
let redacted_variants = variants.iter().map(|v| v.ctor(&redacted_enum)); let redacted_variants = variants.iter().map(|v| v.ctor(&redacted_enum));
@ -400,9 +400,9 @@ fn expand_possibly_redacted_enum(
let serde = quote! { #ruma_events::exports::serde }; let serde = quote! { #ruma_events::exports::serde };
let serde_json = quote! { #ruma_events::exports::serde_json }; let serde_json = quote! { #ruma_events::exports::serde_json };
let ident = format_ident!("AnyPossiblyRedacted{}", kind.to_event_ident(var).unwrap()); let ident = format_ident!("AnyPossiblyRedacted{}", kind.to_event_ident(var));
let regular_enum_ident = kind.to_event_enum_ident(var).unwrap(); let regular_enum_ident = kind.to_event_enum_ident(var);
let redacted_enum_ident = kind.to_event_enum_ident(var.to_redacted().unwrap()).unwrap(); let redacted_enum_ident = kind.to_event_enum_ident(var.to_redacted());
quote! { quote! {
/// An enum that holds either regular un-redacted events or redacted events. /// An enum that holds either regular un-redacted events or redacted events.
@ -461,7 +461,7 @@ fn expand_accessor_methods(
variants: &[EventEnumVariant], variants: &[EventEnumVariant],
ruma_events: &TokenStream, ruma_events: &TokenStream,
) -> TokenStream { ) -> TokenStream {
let ident = kind.to_event_enum_ident(var).unwrap(); let ident = kind.to_event_enum_ident(var);
let self_variants: Vec<_> = variants.iter().map(|v| v.match_arm(quote! { Self })).collect(); let self_variants: Vec<_> = variants.iter().map(|v| v.match_arm(quote! { Self })).collect();
let content_accessors = (!var.is_redacted()).then(|| { let content_accessors = (!var.is_redacted()).then(|| {

View File

@ -49,27 +49,27 @@ impl EventKindVariation {
matches!(self, Self::Sync | Self::RedactedSync) matches!(self, Self::Sync | Self::RedactedSync)
} }
pub fn to_redacted(self) -> Option<Self> { pub fn to_redacted(self) -> Self {
match self { match self {
EventKindVariation::Full => Some(EventKindVariation::Redacted), EventKindVariation::Full => EventKindVariation::Redacted,
EventKindVariation::Sync => Some(EventKindVariation::RedactedSync), EventKindVariation::Sync => EventKindVariation::RedactedSync,
_ => None, _ => panic!("No redacted form of {:?}", self),
} }
} }
pub fn to_sync(self) -> Option<Self> { pub fn to_sync(self) -> Self {
match self { match self {
EventKindVariation::Full => Some(EventKindVariation::Sync), EventKindVariation::Full => EventKindVariation::Sync,
EventKindVariation::Redacted => Some(EventKindVariation::RedactedSync), EventKindVariation::Redacted => EventKindVariation::RedactedSync,
_ => None, _ => panic!("No sync form of {:?}", self),
} }
} }
pub fn to_full(self) -> Option<Self> { pub fn to_full(self) -> Self {
match self { match self {
EventKindVariation::Sync => Some(EventKindVariation::Full), EventKindVariation::Sync => EventKindVariation::Full,
EventKindVariation::RedactedSync => Some(EventKindVariation::Redacted), EventKindVariation::RedactedSync => EventKindVariation::Redacted,
_ => None, _ => panic!("No full form of {:?}", self),
} }
} }
} }
@ -125,10 +125,9 @@ impl IdentFragment for EventKindVariation {
} }
impl EventKind { impl EventKind {
pub fn to_event_ident(self, var: EventKindVariation) -> Option<Ident> { pub fn try_to_event_ident(self, var: EventKindVariation) -> Option<Ident> {
use EventKindVariation as V; use EventKindVariation as V;
// this match is only used to validate the input
match (self, var) { match (self, var) {
(_, V::Full) (_, V::Full)
| (Self::Message | Self::RoomRedaction | Self::State | Self::Ephemeral, V::Sync) | (Self::Message | Self::RoomRedaction | Self::State | Self::Ephemeral, V::Sync)
@ -138,8 +137,14 @@ impl EventKind {
} }
} }
pub fn to_event_enum_ident(self, var: EventKindVariation) -> Option<Ident> { pub fn to_event_ident(self, var: EventKindVariation) -> Ident {
Some(format_ident!("Any{}", self.to_event_ident(var)?)) self.try_to_event_ident(var).unwrap_or_else(|| {
panic!("({:?}, {:?}) is not a valid event kind / variation combination", self, var);
})
}
pub fn to_event_enum_ident(self, var: EventKindVariation) -> Ident {
format_ident!("Any{}", self.to_event_ident(var))
} }
/// `Any[kind]EventContent` /// `Any[kind]EventContent`