hyperion/instance/muxer/
muxed_message.rs

1use std::{convert::TryFrom, sync::Arc};
2
3use super::InputMessageData;
4use crate::{image::RawImage, models::Color};
5
6#[derive(Debug, Clone)]
7pub struct MuxedMessage {
8    data: MuxedMessageData,
9}
10
11impl MuxedMessage {
12    pub fn new(data: MuxedMessageData) -> Self {
13        Self { data }
14    }
15
16    pub fn data(&self) -> &MuxedMessageData {
17        &self.data
18    }
19}
20
21impl std::ops::Deref for MuxedMessage {
22    type Target = MuxedMessageData;
23
24    fn deref(&self) -> &Self::Target {
25        &self.data
26    }
27}
28
29#[derive(Debug, Clone)]
30#[allow(unused)]
31pub enum MuxedMessageData {
32    SolidColor {
33        priority: i32,
34        duration: Option<chrono::Duration>,
35        color: Color,
36    },
37    Image {
38        priority: i32,
39        duration: Option<chrono::Duration>,
40        image: Arc<RawImage>,
41    },
42    LedColors {
43        priority: i32,
44        duration: Option<chrono::Duration>,
45        led_colors: Arc<Vec<Color>>,
46    },
47}
48
49impl MuxedMessageData {
50    pub fn priority(&self) -> i32 {
51        match self {
52            MuxedMessageData::SolidColor { priority, .. } => *priority,
53            MuxedMessageData::Image { priority, .. } => *priority,
54            MuxedMessageData::LedColors { priority, .. } => *priority,
55        }
56    }
57
58    pub fn color(&self) -> Option<Color> {
59        match self {
60            MuxedMessageData::SolidColor { color, .. } => Some(*color),
61            _ => None,
62        }
63    }
64}
65
66impl TryFrom<InputMessageData> for MuxedMessageData {
67    type Error = ();
68
69    fn try_from(value: InputMessageData) -> Result<Self, Self::Error> {
70        match value {
71            InputMessageData::ClearAll
72            | InputMessageData::Clear { .. }
73            | InputMessageData::Effect { .. } => Err(()),
74            InputMessageData::SolidColor {
75                priority,
76                duration,
77                color,
78            } => Ok(Self::SolidColor {
79                priority,
80                duration,
81                color,
82            }),
83            InputMessageData::Image {
84                priority,
85                duration,
86                image,
87            } => Ok(Self::Image {
88                priority,
89                duration,
90                image,
91            }),
92            InputMessageData::LedColors {
93                priority,
94                duration,
95                led_colors,
96            } => Ok(Self::LedColors {
97                priority,
98                duration,
99                led_colors,
100            }),
101        }
102    }
103}