message_type.rs
1 //! App-layer message type labels for UI and gateway routing. 2 3 use crate::protos::de_mls::messages::v1::{ 4 GroupUpdateRequest, ViolationType, app_message, group_update_request, 5 }; 6 7 /// Message type constants for consistency and type safety in app/UI code. 8 pub mod message_types { 9 pub const CONVERSATION_MESSAGE: &str = "ConversationMessage"; 10 pub const BAN_REQUEST: &str = "BanRequest"; 11 pub const PROPOSAL: &str = "Proposal"; 12 pub const VOTE: &str = "Vote"; 13 pub const VOTE_PAYLOAD: &str = "VotePayload"; 14 pub const USER_VOTE: &str = "UserVote"; 15 pub const PROPOSAL_ADDED: &str = "ProposalAdded"; 16 pub const COMMIT_CANDIDATE: &str = "CommitCandidate"; 17 pub const UNKNOWN: &str = "Unknown"; 18 } 19 20 /// Trait for app-facing message type labels. 21 pub trait MessageType { 22 fn message_type(&self) -> &'static str; 23 } 24 25 impl MessageType for app_message::Payload { 26 fn message_type(&self) -> &'static str { 27 use message_types::*; 28 match self { 29 app_message::Payload::ConversationMessage(_) => CONVERSATION_MESSAGE, 30 app_message::Payload::BanRequest(_) => BAN_REQUEST, 31 app_message::Payload::Proposal(_) => PROPOSAL, 32 app_message::Payload::Vote(_) => VOTE, 33 app_message::Payload::VotePayload(_) => VOTE_PAYLOAD, 34 app_message::Payload::UserVote(_) => USER_VOTE, 35 app_message::Payload::ProposalAdded(_) => PROPOSAL_ADDED, 36 app_message::Payload::CommitCandidate(_) => COMMIT_CANDIDATE, 37 } 38 } 39 } 40 41 impl MessageType for GroupUpdateRequest { 42 fn message_type(&self) -> &'static str { 43 match &self.payload { 44 Some(group_update_request::Payload::InviteMember(_)) => "Add Member", 45 Some(group_update_request::Payload::RemoveMember(_)) => "Remove Member", 46 Some(group_update_request::Payload::EmergencyCriteria(ec)) => ec 47 .evidence 48 .as_ref() 49 .map(|e| match ViolationType::try_from(e.violation_type) { 50 Ok(ViolationType::BrokenCommit) => "Emergency: Broken Commit", 51 Ok(ViolationType::BrokenMlsProposal) => "Emergency: Broken MLS Proposal", 52 Ok(ViolationType::CensorshipInactivity) => "Emergency: Censorship/Inactivity", 53 _ => "Emergency: Unknown Violation", 54 }) 55 .unwrap_or("Emergency: Unknown Violation"), 56 _ => "Unknown", 57 } 58 } 59 }