Skip to main content

dioxus_html/events/
media.rs

1use dioxus_core::Event;
2
3pub type MediaEvent = Event<MediaData>;
4pub struct MediaData {
5    inner: Box<dyn HasMediaData>,
6}
7
8impl<E: HasMediaData> From<E> for MediaData {
9    fn from(e: E) -> Self {
10        Self { inner: Box::new(e) }
11    }
12}
13
14impl std::fmt::Debug for MediaData {
15    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
16        f.debug_struct("MediaData").finish()
17    }
18}
19
20impl PartialEq for MediaData {
21    fn eq(&self, _: &Self) -> bool {
22        true
23    }
24}
25
26impl MediaData {
27    /// Create a new MediaData
28    pub fn new(inner: impl HasMediaData + 'static) -> Self {
29        Self {
30            inner: Box::new(inner),
31        }
32    }
33
34    /// Downcast this event to a concrete event type
35    #[inline(always)]
36    pub fn downcast<T: 'static>(&self) -> Option<&T> {
37        self.inner.as_any().downcast_ref::<T>()
38    }
39}
40
41#[cfg(feature = "serialize")]
42/// A serialized version of MediaData
43#[derive(serde::Serialize, serde::Deserialize, Debug, PartialEq, Clone)]
44pub struct SerializedMediaData {}
45
46#[cfg(feature = "serialize")]
47impl From<&MediaData> for SerializedMediaData {
48    fn from(_: &MediaData) -> Self {
49        Self {}
50    }
51}
52
53#[cfg(feature = "serialize")]
54impl HasMediaData for SerializedMediaData {
55    fn as_any(&self) -> &dyn std::any::Any {
56        self
57    }
58}
59
60#[cfg(feature = "serialize")]
61impl serde::Serialize for MediaData {
62    fn serialize<S: serde::Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
63        SerializedMediaData::from(self).serialize(serializer)
64    }
65}
66
67#[cfg(feature = "serialize")]
68impl<'de> serde::Deserialize<'de> for MediaData {
69    fn deserialize<D: serde::Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
70        let data = SerializedMediaData::deserialize(deserializer)?;
71        Ok(Self {
72            inner: Box::new(data),
73        })
74    }
75}
76
77pub trait HasMediaData: std::any::Any {
78    /// return self as Any
79    fn as_any(&self) -> &dyn std::any::Any;
80}