Reduce macro duplication

This commit is contained in:
Jonas Platte 2019-11-11 23:37:24 +01:00
parent a9840164cd
commit e9d55cbfac
No known key found for this signature in database
GPG Key ID: 7D261D771D915378
3 changed files with 127 additions and 167 deletions

View File

@ -482,125 +482,95 @@ impl TryFromRaw for StateEvent {
} }
} }
macro_rules! impl_from_t_for_event { impl_from_for_enum!(Event, AnswerEvent, CallAnswer);
($ty:ty, $variant:ident) => { impl_from_for_enum!(Event, CandidatesEvent, CallCandidates);
impl From<$ty> for Event { impl_from_for_enum!(Event, HangupEvent, CallHangup);
fn from(event: $ty) -> Self { impl_from_for_enum!(Event, InviteEvent, CallInvite);
Event::$variant(event) impl_from_for_enum!(Event, DirectEvent, Direct);
} impl_from_for_enum!(Event, DummyEvent, Dummy);
} impl_from_for_enum!(Event, ForwardedRoomKeyEvent, ForwardedRoomKey);
}; impl_from_for_enum!(Event, FullyReadEvent, FullyRead);
} impl_from_for_enum!(Event, AcceptEvent, KeyVerificationAccept);
impl_from_for_enum!(Event, CancelEvent, KeyVerificationCancel);
impl_from_for_enum!(Event, KeyEvent, KeyVerificationKey);
impl_from_for_enum!(Event, MacEvent, KeyVerificationMac);
impl_from_for_enum!(Event, RequestEvent, KeyVerificationRequest);
impl_from_for_enum!(Event, StartEvent, KeyVerificationStart);
impl_from_for_enum!(Event, IgnoredUserListEvent, IgnoredUserList);
impl_from_for_enum!(Event, PresenceEvent, Presence);
impl_from_for_enum!(Event, PushRulesEvent, PushRules);
impl_from_for_enum!(Event, ReceiptEvent, Receipt);
impl_from_for_enum!(Event, AliasesEvent, RoomAliases);
impl_from_for_enum!(Event, AvatarEvent, RoomAvatar);
impl_from_for_enum!(Event, CanonicalAliasEvent, RoomCanonicalAlias);
impl_from_for_enum!(Event, CreateEvent, RoomCreate);
impl_from_for_enum!(Event, EncryptedEvent, RoomEncrypted);
impl_from_for_enum!(Event, EncryptionEvent, RoomEncryption);
impl_from_for_enum!(Event, GuestAccessEvent, RoomGuestAccess);
impl_from_for_enum!(Event, HistoryVisibilityEvent, RoomHistoryVisibility);
impl_from_for_enum!(Event, JoinRulesEvent, RoomJoinRules);
impl_from_for_enum!(Event, MemberEvent, RoomMember);
impl_from_for_enum!(Event, MessageEvent, RoomMessage);
impl_from_for_enum!(Event, FeedbackEvent, RoomMessageFeedback);
impl_from_for_enum!(Event, NameEvent, RoomName);
impl_from_for_enum!(Event, PinnedEventsEvent, RoomPinnedEvents);
impl_from_for_enum!(Event, PowerLevelsEvent, RoomPowerLevels);
impl_from_for_enum!(Event, RedactionEvent, RoomRedaction);
impl_from_for_enum!(Event, ServerAclEvent, RoomServerAcl);
impl_from_for_enum!(Event, ThirdPartyInviteEvent, RoomThirdPartyInvite);
impl_from_for_enum!(Event, TombstoneEvent, RoomTombstone);
impl_from_for_enum!(Event, TopicEvent, RoomTopic);
impl_from_for_enum!(Event, RoomKeyEvent, RoomKey);
impl_from_for_enum!(Event, RoomKeyRequestEvent, RoomKeyRequest);
impl_from_for_enum!(Event, StickerEvent, Sticker);
impl_from_for_enum!(Event, TagEvent, Tag);
impl_from_for_enum!(Event, TypingEvent, Typing);
impl_from_for_enum!(Event, CustomEvent, Custom);
impl_from_for_enum!(Event, CustomRoomEvent, CustomRoom);
impl_from_for_enum!(Event, CustomStateEvent, CustomState);
impl_from_t_for_event!(AnswerEvent, CallAnswer); impl_from_for_enum!(RoomEvent, AnswerEvent, CallAnswer);
impl_from_t_for_event!(CandidatesEvent, CallCandidates); impl_from_for_enum!(RoomEvent, CandidatesEvent, CallCandidates);
impl_from_t_for_event!(HangupEvent, CallHangup); impl_from_for_enum!(RoomEvent, HangupEvent, CallHangup);
impl_from_t_for_event!(InviteEvent, CallInvite); impl_from_for_enum!(RoomEvent, InviteEvent, CallInvite);
impl_from_t_for_event!(DirectEvent, Direct); impl_from_for_enum!(RoomEvent, AliasesEvent, RoomAliases);
impl_from_t_for_event!(DummyEvent, Dummy); impl_from_for_enum!(RoomEvent, AvatarEvent, RoomAvatar);
impl_from_t_for_event!(ForwardedRoomKeyEvent, ForwardedRoomKey); impl_from_for_enum!(RoomEvent, CanonicalAliasEvent, RoomCanonicalAlias);
impl_from_t_for_event!(FullyReadEvent, FullyRead); impl_from_for_enum!(RoomEvent, CreateEvent, RoomCreate);
impl_from_t_for_event!(AcceptEvent, KeyVerificationAccept); impl_from_for_enum!(RoomEvent, EncryptedEvent, RoomEncrypted);
impl_from_t_for_event!(CancelEvent, KeyVerificationCancel); impl_from_for_enum!(RoomEvent, EncryptionEvent, RoomEncryption);
impl_from_t_for_event!(KeyEvent, KeyVerificationKey); impl_from_for_enum!(RoomEvent, GuestAccessEvent, RoomGuestAccess);
impl_from_t_for_event!(MacEvent, KeyVerificationMac); impl_from_for_enum!(RoomEvent, HistoryVisibilityEvent, RoomHistoryVisibility);
impl_from_t_for_event!(RequestEvent, KeyVerificationRequest); impl_from_for_enum!(RoomEvent, JoinRulesEvent, RoomJoinRules);
impl_from_t_for_event!(StartEvent, KeyVerificationStart); impl_from_for_enum!(RoomEvent, MemberEvent, RoomMember);
impl_from_t_for_event!(IgnoredUserListEvent, IgnoredUserList); impl_from_for_enum!(RoomEvent, MessageEvent, RoomMessage);
impl_from_t_for_event!(PresenceEvent, Presence); impl_from_for_enum!(RoomEvent, FeedbackEvent, RoomMessageFeedback);
impl_from_t_for_event!(PushRulesEvent, PushRules); impl_from_for_enum!(RoomEvent, NameEvent, RoomName);
impl_from_t_for_event!(ReceiptEvent, Receipt); impl_from_for_enum!(RoomEvent, PinnedEventsEvent, RoomPinnedEvents);
impl_from_t_for_event!(AliasesEvent, RoomAliases); impl_from_for_enum!(RoomEvent, PowerLevelsEvent, RoomPowerLevels);
impl_from_t_for_event!(AvatarEvent, RoomAvatar); impl_from_for_enum!(RoomEvent, RedactionEvent, RoomRedaction);
impl_from_t_for_event!(CanonicalAliasEvent, RoomCanonicalAlias); impl_from_for_enum!(RoomEvent, ServerAclEvent, RoomServerAcl);
impl_from_t_for_event!(CreateEvent, RoomCreate); impl_from_for_enum!(RoomEvent, StickerEvent, Sticker);
impl_from_t_for_event!(EncryptedEvent, RoomEncrypted); impl_from_for_enum!(RoomEvent, ThirdPartyInviteEvent, RoomThirdPartyInvite);
impl_from_t_for_event!(EncryptionEvent, RoomEncryption); impl_from_for_enum!(RoomEvent, TombstoneEvent, RoomTombstone);
impl_from_t_for_event!(GuestAccessEvent, RoomGuestAccess); impl_from_for_enum!(RoomEvent, TopicEvent, RoomTopic);
impl_from_t_for_event!(HistoryVisibilityEvent, RoomHistoryVisibility); impl_from_for_enum!(RoomEvent, CustomRoomEvent, CustomRoom);
impl_from_t_for_event!(JoinRulesEvent, RoomJoinRules); impl_from_for_enum!(RoomEvent, CustomStateEvent, CustomState);
impl_from_t_for_event!(MemberEvent, RoomMember);
impl_from_t_for_event!(MessageEvent, RoomMessage);
impl_from_t_for_event!(FeedbackEvent, RoomMessageFeedback);
impl_from_t_for_event!(NameEvent, RoomName);
impl_from_t_for_event!(PinnedEventsEvent, RoomPinnedEvents);
impl_from_t_for_event!(PowerLevelsEvent, RoomPowerLevels);
impl_from_t_for_event!(RedactionEvent, RoomRedaction);
impl_from_t_for_event!(ServerAclEvent, RoomServerAcl);
impl_from_t_for_event!(ThirdPartyInviteEvent, RoomThirdPartyInvite);
impl_from_t_for_event!(TombstoneEvent, RoomTombstone);
impl_from_t_for_event!(TopicEvent, RoomTopic);
impl_from_t_for_event!(RoomKeyEvent, RoomKey);
impl_from_t_for_event!(RoomKeyRequestEvent, RoomKeyRequest);
impl_from_t_for_event!(StickerEvent, Sticker);
impl_from_t_for_event!(TagEvent, Tag);
impl_from_t_for_event!(TypingEvent, Typing);
impl_from_t_for_event!(CustomEvent, Custom);
impl_from_t_for_event!(CustomRoomEvent, CustomRoom);
impl_from_t_for_event!(CustomStateEvent, CustomState);
macro_rules! impl_from_t_for_room_event { impl_from_for_enum!(StateEvent, AliasesEvent, RoomAliases);
($ty:ty, $variant:ident) => { impl_from_for_enum!(StateEvent, AvatarEvent, RoomAvatar);
impl From<$ty> for RoomEvent { impl_from_for_enum!(StateEvent, CanonicalAliasEvent, RoomCanonicalAlias);
fn from(event: $ty) -> Self { impl_from_for_enum!(StateEvent, CreateEvent, RoomCreate);
RoomEvent::$variant(event) impl_from_for_enum!(StateEvent, EncryptionEvent, RoomEncryption);
} impl_from_for_enum!(StateEvent, GuestAccessEvent, RoomGuestAccess);
} impl_from_for_enum!(StateEvent, HistoryVisibilityEvent, RoomHistoryVisibility);
}; impl_from_for_enum!(StateEvent, JoinRulesEvent, RoomJoinRules);
} impl_from_for_enum!(StateEvent, MemberEvent, RoomMember);
impl_from_for_enum!(StateEvent, NameEvent, RoomName);
impl_from_t_for_room_event!(AnswerEvent, CallAnswer); impl_from_for_enum!(StateEvent, PinnedEventsEvent, RoomPinnedEvents);
impl_from_t_for_room_event!(CandidatesEvent, CallCandidates); impl_from_for_enum!(StateEvent, PowerLevelsEvent, RoomPowerLevels);
impl_from_t_for_room_event!(HangupEvent, CallHangup); impl_from_for_enum!(StateEvent, ServerAclEvent, RoomServerAcl);
impl_from_t_for_room_event!(InviteEvent, CallInvite); impl_from_for_enum!(StateEvent, ThirdPartyInviteEvent, RoomThirdPartyInvite);
impl_from_t_for_room_event!(AliasesEvent, RoomAliases); impl_from_for_enum!(StateEvent, TombstoneEvent, RoomTombstone);
impl_from_t_for_room_event!(AvatarEvent, RoomAvatar); impl_from_for_enum!(StateEvent, TopicEvent, RoomTopic);
impl_from_t_for_room_event!(CanonicalAliasEvent, RoomCanonicalAlias); impl_from_for_enum!(StateEvent, CustomStateEvent, CustomState);
impl_from_t_for_room_event!(CreateEvent, RoomCreate);
impl_from_t_for_room_event!(EncryptedEvent, RoomEncrypted);
impl_from_t_for_room_event!(EncryptionEvent, RoomEncryption);
impl_from_t_for_room_event!(GuestAccessEvent, RoomGuestAccess);
impl_from_t_for_room_event!(HistoryVisibilityEvent, RoomHistoryVisibility);
impl_from_t_for_room_event!(JoinRulesEvent, RoomJoinRules);
impl_from_t_for_room_event!(MemberEvent, RoomMember);
impl_from_t_for_room_event!(MessageEvent, RoomMessage);
impl_from_t_for_room_event!(FeedbackEvent, RoomMessageFeedback);
impl_from_t_for_room_event!(NameEvent, RoomName);
impl_from_t_for_room_event!(PinnedEventsEvent, RoomPinnedEvents);
impl_from_t_for_room_event!(PowerLevelsEvent, RoomPowerLevels);
impl_from_t_for_room_event!(RedactionEvent, RoomRedaction);
impl_from_t_for_room_event!(ServerAclEvent, RoomServerAcl);
impl_from_t_for_room_event!(StickerEvent, Sticker);
impl_from_t_for_room_event!(ThirdPartyInviteEvent, RoomThirdPartyInvite);
impl_from_t_for_room_event!(TombstoneEvent, RoomTombstone);
impl_from_t_for_room_event!(TopicEvent, RoomTopic);
impl_from_t_for_room_event!(CustomRoomEvent, CustomRoom);
impl_from_t_for_room_event!(CustomStateEvent, CustomState);
macro_rules! impl_from_t_for_state_event {
($ty:ty, $variant:ident) => {
impl From<$ty> for StateEvent {
fn from(event: $ty) -> Self {
StateEvent::$variant(event)
}
}
};
}
impl_from_t_for_state_event!(AliasesEvent, RoomAliases);
impl_from_t_for_state_event!(AvatarEvent, RoomAvatar);
impl_from_t_for_state_event!(CanonicalAliasEvent, RoomCanonicalAlias);
impl_from_t_for_state_event!(CreateEvent, RoomCreate);
impl_from_t_for_state_event!(EncryptionEvent, RoomEncryption);
impl_from_t_for_state_event!(GuestAccessEvent, RoomGuestAccess);
impl_from_t_for_state_event!(HistoryVisibilityEvent, RoomHistoryVisibility);
impl_from_t_for_state_event!(JoinRulesEvent, RoomJoinRules);
impl_from_t_for_state_event!(MemberEvent, RoomMember);
impl_from_t_for_state_event!(NameEvent, RoomName);
impl_from_t_for_state_event!(PinnedEventsEvent, RoomPinnedEvents);
impl_from_t_for_state_event!(PowerLevelsEvent, RoomPowerLevels);
impl_from_t_for_state_event!(ServerAclEvent, RoomServerAcl);
impl_from_t_for_state_event!(ThirdPartyInviteEvent, RoomThirdPartyInvite);
impl_from_t_for_state_event!(TombstoneEvent, RoomTombstone);
impl_from_t_for_state_event!(TopicEvent, RoomTopic);
impl_from_t_for_state_event!(CustomStateEvent, CustomState);

View File

@ -193,51 +193,31 @@ impl TryFromRaw for RoomEvent {
} }
} }
macro_rules! impl_from_t_for_event { impl_from_for_enum!(Event, DirectEvent, Direct);
($ty:ty, $variant:ident) => { impl_from_for_enum!(Event, DummyEvent, Dummy);
impl From<$ty> for Event { impl_from_for_enum!(Event, ForwardedRoomKeyEvent, ForwardedRoomKey);
fn from(event: $ty) -> Self { impl_from_for_enum!(Event, FullyReadEvent, FullyRead);
Event::$variant(event) impl_from_for_enum!(Event, AcceptEvent, KeyVerificationAccept);
} impl_from_for_enum!(Event, CancelEvent, KeyVerificationCancel);
} impl_from_for_enum!(Event, KeyEvent, KeyVerificationKey);
}; impl_from_for_enum!(Event, MacEvent, KeyVerificationMac);
} impl_from_for_enum!(Event, RequestEvent, KeyVerificationRequest);
impl_from_for_enum!(Event, StartEvent, KeyVerificationStart);
impl_from_for_enum!(Event, IgnoredUserListEvent, IgnoredUserList);
impl_from_for_enum!(Event, PresenceEvent, Presence);
impl_from_for_enum!(Event, PushRulesEvent, PushRules);
impl_from_for_enum!(Event, ReceiptEvent, Receipt);
impl_from_for_enum!(Event, TagEvent, Tag);
impl_from_for_enum!(Event, TypingEvent, Typing);
impl_from_for_enum!(Event, CustomEvent, Custom);
impl_from_t_for_event!(DirectEvent, Direct); impl_from_for_enum!(RoomEvent, AnswerEvent, CallAnswer);
impl_from_t_for_event!(DummyEvent, Dummy); impl_from_for_enum!(RoomEvent, CandidatesEvent, CallCandidates);
impl_from_t_for_event!(ForwardedRoomKeyEvent, ForwardedRoomKey); impl_from_for_enum!(RoomEvent, HangupEvent, CallHangup);
impl_from_t_for_event!(FullyReadEvent, FullyRead); impl_from_for_enum!(RoomEvent, InviteEvent, CallInvite);
impl_from_t_for_event!(AcceptEvent, KeyVerificationAccept); impl_from_for_enum!(RoomEvent, EncryptedEvent, RoomEncrypted);
impl_from_t_for_event!(CancelEvent, KeyVerificationCancel); impl_from_for_enum!(RoomEvent, MessageEvent, RoomMessage);
impl_from_t_for_event!(KeyEvent, KeyVerificationKey); impl_from_for_enum!(RoomEvent, FeedbackEvent, RoomMessageFeedback);
impl_from_t_for_event!(MacEvent, KeyVerificationMac); impl_from_for_enum!(RoomEvent, RedactionEvent, RoomRedaction);
impl_from_t_for_event!(RequestEvent, KeyVerificationRequest); impl_from_for_enum!(RoomEvent, StickerEvent, Sticker);
impl_from_t_for_event!(StartEvent, KeyVerificationStart); impl_from_for_enum!(RoomEvent, CustomRoomEvent, CustomRoom);
impl_from_t_for_event!(IgnoredUserListEvent, IgnoredUserList);
impl_from_t_for_event!(PresenceEvent, Presence);
impl_from_t_for_event!(PushRulesEvent, PushRules);
impl_from_t_for_event!(ReceiptEvent, Receipt);
impl_from_t_for_event!(TagEvent, Tag);
impl_from_t_for_event!(TypingEvent, Typing);
impl_from_t_for_event!(CustomEvent, Custom);
macro_rules! impl_from_t_for_room_event {
($ty:ty, $variant:ident) => {
impl From<$ty> for RoomEvent {
fn from(event: $ty) -> Self {
RoomEvent::$variant(event)
}
}
};
}
impl_from_t_for_room_event!(AnswerEvent, CallAnswer);
impl_from_t_for_room_event!(CandidatesEvent, CallCandidates);
impl_from_t_for_room_event!(HangupEvent, CallHangup);
impl_from_t_for_room_event!(InviteEvent, CallInvite);
impl_from_t_for_room_event!(EncryptedEvent, RoomEncrypted);
impl_from_t_for_room_event!(MessageEvent, RoomMessage);
impl_from_t_for_room_event!(FeedbackEvent, RoomMessageFeedback);
impl_from_t_for_room_event!(RedactionEvent, RoomRedaction);
impl_from_t_for_room_event!(StickerEvent, Sticker);
impl_from_t_for_room_event!(CustomRoomEvent, CustomRoom);

View File

@ -97,3 +97,13 @@ macro_rules! impl_state_event {
} }
}; };
} }
macro_rules! impl_from_for_enum {
($self_ty:ident, $inner_ty:ty, $variant:ident) => {
impl From<$inner_ty> for $self_ty {
fn from(event: $inner_ty) -> Self {
$self_ty::$variant(event)
}
}
};
}