/ src / app / message_type.rs
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  }