diff --git a/crates/ruma-macros/src/events/event_enum.rs b/crates/ruma-macros/src/events/event_enum.rs index 62519b48..29f3a3ec 100644 --- a/crates/ruma-macros/src/events/event_enum.rs +++ b/crates/ruma-macros/src/events/event_enum.rs @@ -508,21 +508,10 @@ fn to_event_path( var: EventKindVariation, ruma_common: &TokenStream, ) -> TokenStream { - let span = name.span(); - let name = name.value(); - - // There is no need to give a good compiler error as `to_camel_case` is called first. - assert_eq!(&name[..2], "m."); - - let path: Vec<_> = name[2..].split('.').collect(); - - let event: String = name[2..] - .split(&['.', '_'] as &[char]) - .map(|s| s.chars().next().unwrap().to_uppercase().to_string() + &s[1..]) - .collect(); - - let path = path.iter().map(|s| Ident::new(s, span)); + let name_val = name.value(); + let path = name_val.strip_prefix("m.").unwrap().split('.').map(|s| Ident::new(s, name.span())); + let event = m_prefix_name_to_type_name(name).unwrap(); let event_name = if kind == EventKind::ToDevice { assert_eq!(var, EventKindVariation::Full); format_ident!("ToDevice{}Event", event) @@ -538,19 +527,10 @@ fn to_event_content_path( prefix: Option<&str>, ruma_common: &TokenStream, ) -> TokenStream { - let span = name.span(); - let name = name.value(); - - // There is no need to give a good compiler error as `to_camel_case` is called first. - assert_eq!(&name[..2], "m."); - - let path: Vec<_> = name[2..].split('.').collect(); - - let event: String = name[2..] - .split(&['.', '_'] as &[char]) - .map(|s| s.chars().next().unwrap().to_uppercase().to_string() + &s[1..]) - .collect(); + let name_val = name.value(); + let path = name_val.strip_prefix("m.").unwrap().split('.').map(|s| Ident::new(s, name.span())); + let event = m_prefix_name_to_type_name(name).unwrap(); let content_str = match kind { EventKind::ToDevice => { format_ident!("ToDevice{}{}EventContent", prefix.unwrap_or(""), event) @@ -558,8 +538,6 @@ fn to_event_content_path( _ => format_ident!("{}{}EventContent", prefix.unwrap_or(""), event), }; - let path = path.iter().map(|s| Ident::new(s, span)); - quote! { #ruma_common::events::#( #path )::*::#content_str } diff --git a/crates/ruma-macros/src/util.rs b/crates/ruma-macros/src/util.rs index e7005a69..f1864547 100644 --- a/crates/ruma-macros/src/util.rs +++ b/crates/ruma-macros/src/util.rs @@ -39,14 +39,14 @@ pub(crate) fn m_prefix_name_to_type_name(name: &LitStr) -> syn::Result { let span = name.span(); let name = name.value(); - if &name[..2] != "m." { - return Err(syn::Error::new( + let name = name.strip_prefix("m.").ok_or_else(|| { + syn::Error::new( span, format!("well-known matrix events have to start with `m.` found `{}`", name), - )); - } + ) + })?; - let s: String = name[2..] + let s: String = name .split(&['.', '_'] as &[char]) .map(|s| s.chars().next().unwrap().to_uppercase().to_string() + &s[1..]) .collect();