Skip to main content

unofficial_extras\message/
mod.rs

1//! Message information provided by Unofficial Extras.
2
3mod npc;
4mod squad;
5
6pub use self::{npc::*, squad::*};
7
8#[cfg(feature = "serde")]
9use serde::{Deserialize, Serialize};
10
11#[cfg(feature = "strum")]
12use strum::{Display, EnumCount, EnumIter, IntoStaticStr, VariantNames};
13
14/// A chat message.
15#[derive(Clone, Copy)]
16#[repr(C)]
17pub union RawMessage {
18    squad: *const SquadMessage,
19    npc: *const NpcMessage,
20}
21
22/// A chat message.
23#[derive(Debug, Clone)]
24pub enum Message<'a> {
25    Squad(&'a SquadMessage),
26    Npc(&'a NpcMessage),
27}
28
29impl Message<'_> {
30    /// Creates a new message from a [`MessageType`] and [`RawMessage`].
31    ///
32    /// # Safety
33    /// The given message must be valid to be interpreted as a message of the given type.
34    #[inline]
35    pub unsafe fn new(message_type: MessageType, message: RawMessage) -> Self {
36        match message_type {
37            MessageType::Squad => Self::Squad(
38                unsafe { message.squad.as_ref() }
39                    .expect("invalid unofficial extras squad message info"),
40            ),
41            MessageType::Npc => Self::Npc(
42                unsafe { message.npc.as_ref() }
43                    .expect("invalid unofficial extras npc message info"),
44            ),
45        }
46    }
47}
48
49/// Type of message.
50#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
51#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
52#[cfg_attr(
53    feature = "strum",
54    derive(Display, EnumCount, EnumIter, IntoStaticStr, VariantNames)
55)]
56#[repr(C)]
57pub enum MessageType {
58    /// Party or squad chat message.
59    Squad = 0,
60
61    /// NPC message (selectable in ingame-chat as "NPC").
62    Npc = 1,
63}