add missing TimelineEventType -> StateEventType conversion replacing anti-pattern to_string().into()
Signed-off-by: Jason Volk <jason@zemos.net>
This commit is contained in:
parent
b560338b2a
commit
010ae6daad
@ -48,31 +48,31 @@ pub fn expand_event_type_enum(
|
|||||||
let mut res = TokenStream::new();
|
let mut res = TokenStream::new();
|
||||||
|
|
||||||
res.extend(
|
res.extend(
|
||||||
generate_enum("TimelineEventType", &timeline, &ruma_events)
|
generate_enum("TimelineEventType", &timeline, &ruma_events, Some(&state))
|
||||||
.unwrap_or_else(syn::Error::into_compile_error),
|
.unwrap_or_else(syn::Error::into_compile_error),
|
||||||
);
|
);
|
||||||
res.extend(
|
res.extend(
|
||||||
generate_enum("StateEventType", &state, &ruma_events)
|
generate_enum("StateEventType", &state, &ruma_events, None)
|
||||||
.unwrap_or_else(syn::Error::into_compile_error),
|
.unwrap_or_else(syn::Error::into_compile_error),
|
||||||
);
|
);
|
||||||
res.extend(
|
res.extend(
|
||||||
generate_enum("MessageLikeEventType", &message, &ruma_events)
|
generate_enum("MessageLikeEventType", &message, &ruma_events, None)
|
||||||
.unwrap_or_else(syn::Error::into_compile_error),
|
.unwrap_or_else(syn::Error::into_compile_error),
|
||||||
);
|
);
|
||||||
res.extend(
|
res.extend(
|
||||||
generate_enum("EphemeralRoomEventType", &ephemeral, &ruma_events)
|
generate_enum("EphemeralRoomEventType", &ephemeral, &ruma_events, None)
|
||||||
.unwrap_or_else(syn::Error::into_compile_error),
|
.unwrap_or_else(syn::Error::into_compile_error),
|
||||||
);
|
);
|
||||||
res.extend(
|
res.extend(
|
||||||
generate_enum("RoomAccountDataEventType", &room_account, &ruma_events)
|
generate_enum("RoomAccountDataEventType", &room_account, &ruma_events, None)
|
||||||
.unwrap_or_else(syn::Error::into_compile_error),
|
.unwrap_or_else(syn::Error::into_compile_error),
|
||||||
);
|
);
|
||||||
res.extend(
|
res.extend(
|
||||||
generate_enum("GlobalAccountDataEventType", &global_account, &ruma_events)
|
generate_enum("GlobalAccountDataEventType", &global_account, &ruma_events, None)
|
||||||
.unwrap_or_else(syn::Error::into_compile_error),
|
.unwrap_or_else(syn::Error::into_compile_error),
|
||||||
);
|
);
|
||||||
res.extend(
|
res.extend(
|
||||||
generate_enum("ToDeviceEventType", &to_device, &ruma_events)
|
generate_enum("ToDeviceEventType", &to_device, &ruma_events, None)
|
||||||
.unwrap_or_else(syn::Error::into_compile_error),
|
.unwrap_or_else(syn::Error::into_compile_error),
|
||||||
);
|
);
|
||||||
|
|
||||||
@ -83,6 +83,7 @@ fn generate_enum(
|
|||||||
ident: &str,
|
ident: &str,
|
||||||
input: &[&Vec<EventEnumEntry>],
|
input: &[&Vec<EventEnumEntry>],
|
||||||
ruma_common: &TokenStream,
|
ruma_common: &TokenStream,
|
||||||
|
other: Option<&[&Vec<EventEnumEntry>]>,
|
||||||
) -> syn::Result<TokenStream> {
|
) -> syn::Result<TokenStream> {
|
||||||
let serde = quote! { #ruma_common::exports::serde };
|
let serde = quote! { #ruma_common::exports::serde };
|
||||||
let enum_doc = format!("The type of `{}` this is.", ident.strip_suffix("Type").unwrap());
|
let enum_doc = format!("The type of `{}` this is.", ident.strip_suffix("Type").unwrap());
|
||||||
@ -101,6 +102,18 @@ fn generate_enum(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let mut other_deduped: Vec<&EventEnumEntry> = vec![];
|
||||||
|
for item in other.iter().flat_map(|o| o.iter()).copied().flatten() {
|
||||||
|
if let Some(idx) = other_deduped.iter().position(|e| e.ev_type == item.ev_type) {
|
||||||
|
// If there is a variant without config attributes use that
|
||||||
|
if other_deduped[idx].attrs != item.attrs && item.attrs.is_empty() {
|
||||||
|
other_deduped[idx] = item;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
other_deduped.push(item);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let event_types = deduped.iter().map(|e| &e.ev_type);
|
let event_types = deduped.iter().map(|e| &e.ev_type);
|
||||||
|
|
||||||
let variants: Vec<_> = deduped
|
let variants: Vec<_> = deduped
|
||||||
@ -189,6 +202,38 @@ fn generate_enum(
|
|||||||
None
|
None
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let from_ident_for_state = if ident == "TimelineEventType" {
|
||||||
|
let match_arms: Vec<_> = other_deduped
|
||||||
|
.iter()
|
||||||
|
.map(|e| {
|
||||||
|
let v = e.to_variant()?;
|
||||||
|
let ident_var = v.match_arm(quote! { #ident });
|
||||||
|
let state_var = v.ctor(quote! { Self });
|
||||||
|
|
||||||
|
Ok(if e.has_type_fragment() {
|
||||||
|
quote! { #ident_var (_s) => #state_var (_s) }
|
||||||
|
} else {
|
||||||
|
quote! { #ident_var => #state_var }
|
||||||
|
})
|
||||||
|
})
|
||||||
|
.collect::<syn::Result<_>>()?;
|
||||||
|
|
||||||
|
Some(quote! {
|
||||||
|
#[allow(deprecated)]
|
||||||
|
impl ::std::convert::From<#ident> for StateEventType {
|
||||||
|
fn from(s: #ident) -> Self {
|
||||||
|
match s {
|
||||||
|
#(#match_arms,)*
|
||||||
|
_ => panic!("EventType is not a StateEventType"),
|
||||||
|
//_ => compile_error!("EventType is not a StateEventType"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
})
|
||||||
|
} else {
|
||||||
|
None
|
||||||
|
};
|
||||||
|
|
||||||
Ok(quote! {
|
Ok(quote! {
|
||||||
#[doc = #enum_doc]
|
#[doc = #enum_doc]
|
||||||
///
|
///
|
||||||
@ -269,5 +314,6 @@ fn generate_enum(
|
|||||||
}
|
}
|
||||||
|
|
||||||
#from_ident_for_timeline
|
#from_ident_for_timeline
|
||||||
|
#from_ident_for_state
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user