medea_control_api_proto/control/
room.rs

1//! [`Room`] definitions.
2
3use derive_more::with_trait::{AsRef, Display, From, Into};
4use ref_cast::RefCast;
5#[cfg(feature = "serde")]
6use serde::{Deserialize, Serialize};
7
8use super::{Pipeline, member};
9
10/// Media [`Element`] representing a single space where multiple [`Member`]s can
11/// interact with each other.
12///
13/// [`Element`]: crate::Element
14/// [`Member`]: crate::Member
15#[derive(Clone, Debug, Eq, PartialEq)]
16#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
17pub struct Room {
18    /// ID of this [`Room`] media [`Element`].
19    ///
20    /// [`Element`]: crate::Element
21    pub id: Id,
22
23    /// [`Spec`] of this [`Room`] media [`Element`].
24    ///
25    /// [`Element`]: crate::Element
26    pub spec: Spec,
27}
28
29/// Spec of a [`Room`] media [`Element`].
30///
31/// [`Element`]: crate::Element
32#[derive(Clone, Debug, Eq, PartialEq)]
33#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
34pub struct Spec {
35    /// Media pipeline representing [`Member`]s of this [`Room`].
36    ///
37    /// [`Element`]: crate::Element
38    /// [`Member`]: crate::Member
39    pub pipeline: Pipeline<member::Id, PipelineSpec>,
40}
41
42/// Specs of [`Element`]s allowed a [`Room`]'s [`Spec::pipeline`].
43///
44/// [`Element`]: crate::Element
45#[derive(Clone, Debug, Eq, From, PartialEq)]
46#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
47#[cfg_attr(feature = "serde", serde(tag = "kind", content = "spec"))]
48pub enum PipelineSpec {
49    /// [`Member`] media [`Element`].
50    ///
51    /// [`Element`]: crate::Element
52    /// [`Member`]: crate::Member
53    Member(member::Spec),
54}
55
56/// ID of a [`Room`] media [`Element`].
57///
58/// [`Element`]: crate::Element
59#[derive(
60    AsRef,
61    Clone,
62    Debug,
63    Display,
64    Eq,
65    From,
66    Hash,
67    Into,
68    Ord,
69    PartialEq,
70    PartialOrd,
71    RefCast,
72)]
73#[cfg_attr(feature = "serde", derive(Deserialize, Serialize))]
74#[cfg_attr(feature = "serde", serde(transparent))]
75#[from(&str, String)]
76#[into(String)]
77#[repr(transparent)]
78pub struct Id(Box<str>);
79
80#[cfg(feature = "client-api")]
81impl From<medea_client_api_proto::RoomId> for Id {
82    fn from(id: medea_client_api_proto::RoomId) -> Self {
83        id.0.into()
84    }
85}