events-macros: Refactor expand_redacted_enum
This commit is contained in:
parent
c14a0edf15
commit
6d3d6c92db
@ -72,6 +72,8 @@ pub fn expand_event_enums(input: &EventEnumDecl) -> syn::Result<TokenStream> {
|
|||||||
|
|
||||||
if matches!(kind, EventKind::Message | EventKind::State) {
|
if matches!(kind, EventKind::Message | EventKind::State) {
|
||||||
res.extend(expand_redacted_event_enum(kind, &events, attrs, &variants, &ruma_events));
|
res.extend(expand_redacted_event_enum(kind, &events, attrs, &variants, &ruma_events));
|
||||||
|
res.extend(expand_possibly_redacted_enum(kind, V::Full, &ruma_events));
|
||||||
|
res.extend(expand_possibly_redacted_enum(kind, V::Sync, &ruma_events));
|
||||||
res.extend(expand_from_full_event(kind, V::Redacted, &variants));
|
res.extend(expand_from_full_event(kind, V::Redacted, &variants));
|
||||||
res.extend(expand_into_full_event(kind, V::RedactedSync, &variants, &ruma_events));
|
res.extend(expand_into_full_event(kind, V::RedactedSync, &variants, &ruma_events));
|
||||||
}
|
}
|
||||||
@ -148,7 +150,6 @@ fn expand_event_enum(
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
let redacted_enum = expand_redacted_enum(kind, var, ruma_events);
|
|
||||||
let field_accessor_impl = accessor_methods(kind, var, variants, ruma_events);
|
let field_accessor_impl = accessor_methods(kind, var, variants, ruma_events);
|
||||||
let redact_impl = expand_redact(&ident, kind, var, variants, ruma_events);
|
let redact_impl = expand_redact(&ident, kind, var, variants, ruma_events);
|
||||||
let from_impl = expand_from_impl(ident, &content, variants);
|
let from_impl = expand_from_impl(ident, &content, variants);
|
||||||
@ -158,7 +159,6 @@ fn expand_event_enum(
|
|||||||
#field_accessor_impl
|
#field_accessor_impl
|
||||||
#redact_impl
|
#redact_impl
|
||||||
#event_deserialize_impl
|
#event_deserialize_impl
|
||||||
#redacted_enum
|
|
||||||
#from_impl
|
#from_impl
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -398,52 +398,48 @@ fn expand_redact(
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
fn expand_redacted_enum(
|
fn expand_possibly_redacted_enum(
|
||||||
kind: EventKind,
|
kind: EventKind,
|
||||||
var: EventKindVariation,
|
var: EventKindVariation,
|
||||||
ruma_events: &TokenStream,
|
ruma_events: &TokenStream,
|
||||||
) -> Option<TokenStream> {
|
) -> TokenStream {
|
||||||
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 };
|
||||||
|
|
||||||
if let EventKind::State | EventKind::Message = kind {
|
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()?)?;
|
|
||||||
|
|
||||||
Some(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.
|
||||||
#[derive(Clone, Debug, #serde::Serialize)]
|
#[derive(Clone, Debug, #serde::Serialize)]
|
||||||
#[serde(untagged)]
|
#[serde(untagged)]
|
||||||
#[allow(clippy::exhaustive_enums)]
|
#[allow(clippy::exhaustive_enums)]
|
||||||
pub enum #ident {
|
pub enum #ident {
|
||||||
/// An un-redacted event.
|
/// An un-redacted event.
|
||||||
Regular(#regular_enum_ident),
|
Regular(#regular_enum_ident),
|
||||||
|
|
||||||
/// A redacted event.
|
/// A redacted event.
|
||||||
Redacted(#redacted_enum_ident),
|
Redacted(#redacted_enum_ident),
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<'de> #serde::de::Deserialize<'de> for #ident {
|
||||||
|
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||||
|
where
|
||||||
|
D: #serde::de::Deserializer<'de>,
|
||||||
|
{
|
||||||
|
let json = Box::<#serde_json::value::RawValue>::deserialize(deserializer)?;
|
||||||
|
let #ruma_events::RedactionDeHelper { unsigned } =
|
||||||
|
#ruma_events::from_raw_json_value(&json)?;
|
||||||
|
|
||||||
|
Ok(match unsigned {
|
||||||
|
Some(unsigned) if unsigned.redacted_because.is_some() => {
|
||||||
|
Self::Redacted(#ruma_events::from_raw_json_value(&json)?)
|
||||||
|
}
|
||||||
|
_ => Self::Regular(#ruma_events::from_raw_json_value(&json)?),
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
}
|
||||||
impl<'de> #serde::de::Deserialize<'de> for #ident {
|
|
||||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
|
||||||
where
|
|
||||||
D: #serde::de::Deserializer<'de>,
|
|
||||||
{
|
|
||||||
let json = Box::<#serde_json::value::RawValue>::deserialize(deserializer)?;
|
|
||||||
let #ruma_events::RedactionDeHelper { unsigned } =
|
|
||||||
#ruma_events::from_raw_json_value(&json)?;
|
|
||||||
|
|
||||||
Ok(match unsigned {
|
|
||||||
Some(unsigned) if unsigned.redacted_because.is_some() => {
|
|
||||||
Self::Redacted(#ruma_events::from_raw_json_value(&json)?)
|
|
||||||
}
|
|
||||||
_ => Self::Regular(#ruma_events::from_raw_json_value(&json)?),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
None
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -521,7 +517,7 @@ fn accessor_methods(
|
|||||||
var: EventKindVariation,
|
var: EventKindVariation,
|
||||||
variants: &[EventEnumVariant],
|
variants: &[EventEnumVariant],
|
||||||
ruma_events: &TokenStream,
|
ruma_events: &TokenStream,
|
||||||
) -> Option<TokenStream> {
|
) -> TokenStream {
|
||||||
let ident = kind.to_event_enum_ident(var).unwrap();
|
let ident = kind.to_event_enum_ident(var).unwrap();
|
||||||
|
|
||||||
let methods = EVENT_FIELDS.iter().map(|(name, has_field)| {
|
let methods = EVENT_FIELDS.iter().map(|(name, has_field)| {
|
||||||
@ -582,14 +578,14 @@ fn accessor_methods(
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Some(quote! {
|
quote! {
|
||||||
#[automatically_derived]
|
#[automatically_derived]
|
||||||
impl #ident {
|
impl #ident {
|
||||||
#event_type
|
#event_type
|
||||||
#content_accessors
|
#content_accessors
|
||||||
#( #methods )*
|
#( #methods )*
|
||||||
}
|
}
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn to_event_path(
|
fn to_event_path(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user