rust_tdlib/types/
call_state.rs

1use crate::errors::Result;
2use crate::types::*;
3use uuid::Uuid;
4
5use std::fmt::Debug;
6
7/// Describes the current call state
8pub trait TDCallState: Debug + RObject {}
9
10/// Describes the current call state
11#[derive(Debug, Clone, Deserialize, Serialize, Default)]
12#[serde(tag = "@type")]
13pub enum CallState {
14    #[doc(hidden)]
15    #[default]
16    _Default,
17    /// The call has ended successfully
18    #[serde(rename = "callStateDiscarded")]
19    Discarded(CallStateDiscarded),
20    /// The call has ended with an error
21    #[serde(rename = "callStateError")]
22    Error(CallStateError),
23    /// The call has been answered and encryption keys are being exchanged
24    #[serde(rename = "callStateExchangingKeys")]
25    ExchangingKeys(CallStateExchangingKeys),
26    /// The call is hanging up after discardCall has been called
27    #[serde(rename = "callStateHangingUp")]
28    HangingUp(CallStateHangingUp),
29    /// The call is pending, waiting to be accepted by a user
30    #[serde(rename = "callStatePending")]
31    Pending(CallStatePending),
32    /// The call is ready to use
33    #[serde(rename = "callStateReady")]
34    Ready(CallStateReady),
35}
36
37impl RObject for CallState {
38    #[doc(hidden)]
39    fn extra(&self) -> Option<&str> {
40        match self {
41            CallState::Discarded(t) => t.extra(),
42            CallState::Error(t) => t.extra(),
43            CallState::ExchangingKeys(t) => t.extra(),
44            CallState::HangingUp(t) => t.extra(),
45            CallState::Pending(t) => t.extra(),
46            CallState::Ready(t) => t.extra(),
47
48            _ => None,
49        }
50    }
51    #[doc(hidden)]
52    fn client_id(&self) -> Option<i32> {
53        match self {
54            CallState::Discarded(t) => t.client_id(),
55            CallState::Error(t) => t.client_id(),
56            CallState::ExchangingKeys(t) => t.client_id(),
57            CallState::HangingUp(t) => t.client_id(),
58            CallState::Pending(t) => t.client_id(),
59            CallState::Ready(t) => t.client_id(),
60
61            _ => None,
62        }
63    }
64}
65
66impl CallState {
67    pub fn from_json<S: AsRef<str>>(json: S) -> Result<Self> {
68        Ok(serde_json::from_str(json.as_ref())?)
69    }
70    #[doc(hidden)]
71    pub fn _is_default(&self) -> bool {
72        matches!(self, CallState::_Default)
73    }
74}
75
76impl AsRef<CallState> for CallState {
77    fn as_ref(&self) -> &CallState {
78        self
79    }
80}
81
82/// The call has ended successfully
83#[derive(Debug, Clone, Default, Serialize, Deserialize)]
84pub struct CallStateDiscarded {
85    #[doc(hidden)]
86    #[serde(rename(serialize = "@extra", deserialize = "@extra"))]
87    extra: Option<String>,
88    #[serde(rename(serialize = "@client_id", deserialize = "@client_id"))]
89    client_id: Option<i32>,
90    /// The reason, why the call has ended
91
92    #[serde(skip_serializing_if = "CallDiscardReason::_is_default")]
93    reason: CallDiscardReason,
94    /// True, if the call rating must be sent to the server
95
96    #[serde(default)]
97    need_rating: bool,
98    /// True, if the call debug information must be sent to the server
99
100    #[serde(default)]
101    need_debug_information: bool,
102}
103
104impl RObject for CallStateDiscarded {
105    #[doc(hidden)]
106    fn extra(&self) -> Option<&str> {
107        self.extra.as_deref()
108    }
109    #[doc(hidden)]
110    fn client_id(&self) -> Option<i32> {
111        self.client_id
112    }
113}
114
115impl TDCallState for CallStateDiscarded {}
116
117impl CallStateDiscarded {
118    pub fn from_json<S: AsRef<str>>(json: S) -> Result<Self> {
119        Ok(serde_json::from_str(json.as_ref())?)
120    }
121    pub fn builder() -> CallStateDiscardedBuilder {
122        let mut inner = CallStateDiscarded::default();
123        inner.extra = Some(Uuid::new_v4().to_string());
124
125        CallStateDiscardedBuilder { inner }
126    }
127
128    pub fn reason(&self) -> &CallDiscardReason {
129        &self.reason
130    }
131
132    pub fn need_rating(&self) -> bool {
133        self.need_rating
134    }
135
136    pub fn need_debug_information(&self) -> bool {
137        self.need_debug_information
138    }
139}
140
141#[doc(hidden)]
142pub struct CallStateDiscardedBuilder {
143    inner: CallStateDiscarded,
144}
145
146#[deprecated]
147pub type RTDCallStateDiscardedBuilder = CallStateDiscardedBuilder;
148
149impl CallStateDiscardedBuilder {
150    pub fn build(&self) -> CallStateDiscarded {
151        self.inner.clone()
152    }
153
154    pub fn reason<T: AsRef<CallDiscardReason>>(&mut self, reason: T) -> &mut Self {
155        self.inner.reason = reason.as_ref().clone();
156        self
157    }
158
159    pub fn need_rating(&mut self, need_rating: bool) -> &mut Self {
160        self.inner.need_rating = need_rating;
161        self
162    }
163
164    pub fn need_debug_information(&mut self, need_debug_information: bool) -> &mut Self {
165        self.inner.need_debug_information = need_debug_information;
166        self
167    }
168}
169
170impl AsRef<CallStateDiscarded> for CallStateDiscarded {
171    fn as_ref(&self) -> &CallStateDiscarded {
172        self
173    }
174}
175
176impl AsRef<CallStateDiscarded> for CallStateDiscardedBuilder {
177    fn as_ref(&self) -> &CallStateDiscarded {
178        &self.inner
179    }
180}
181
182/// The call has ended with an error
183#[derive(Debug, Clone, Default, Serialize, Deserialize)]
184pub struct CallStateError {
185    #[doc(hidden)]
186    #[serde(rename(serialize = "@extra", deserialize = "@extra"))]
187    extra: Option<String>,
188    #[serde(rename(serialize = "@client_id", deserialize = "@client_id"))]
189    client_id: Option<i32>,
190    /// Error. An error with the code 4005000 will be returned if an outgoing call is missed because of an expired timeout
191    error: Error,
192}
193
194impl RObject for CallStateError {
195    #[doc(hidden)]
196    fn extra(&self) -> Option<&str> {
197        self.extra.as_deref()
198    }
199    #[doc(hidden)]
200    fn client_id(&self) -> Option<i32> {
201        self.client_id
202    }
203}
204
205impl TDCallState for CallStateError {}
206
207impl CallStateError {
208    pub fn from_json<S: AsRef<str>>(json: S) -> Result<Self> {
209        Ok(serde_json::from_str(json.as_ref())?)
210    }
211    pub fn builder() -> CallStateErrorBuilder {
212        let mut inner = CallStateError::default();
213        inner.extra = Some(Uuid::new_v4().to_string());
214
215        CallStateErrorBuilder { inner }
216    }
217
218    pub fn error(&self) -> &Error {
219        &self.error
220    }
221}
222
223#[doc(hidden)]
224pub struct CallStateErrorBuilder {
225    inner: CallStateError,
226}
227
228#[deprecated]
229pub type RTDCallStateErrorBuilder = CallStateErrorBuilder;
230
231impl CallStateErrorBuilder {
232    pub fn build(&self) -> CallStateError {
233        self.inner.clone()
234    }
235
236    pub fn error<T: AsRef<Error>>(&mut self, error: T) -> &mut Self {
237        self.inner.error = error.as_ref().clone();
238        self
239    }
240}
241
242impl AsRef<CallStateError> for CallStateError {
243    fn as_ref(&self) -> &CallStateError {
244        self
245    }
246}
247
248impl AsRef<CallStateError> for CallStateErrorBuilder {
249    fn as_ref(&self) -> &CallStateError {
250        &self.inner
251    }
252}
253
254/// The call has been answered and encryption keys are being exchanged
255#[derive(Debug, Clone, Default, Serialize, Deserialize)]
256pub struct CallStateExchangingKeys {
257    #[doc(hidden)]
258    #[serde(rename(serialize = "@extra", deserialize = "@extra"))]
259    extra: Option<String>,
260    #[serde(rename(serialize = "@client_id", deserialize = "@client_id"))]
261    client_id: Option<i32>,
262}
263
264impl RObject for CallStateExchangingKeys {
265    #[doc(hidden)]
266    fn extra(&self) -> Option<&str> {
267        self.extra.as_deref()
268    }
269    #[doc(hidden)]
270    fn client_id(&self) -> Option<i32> {
271        self.client_id
272    }
273}
274
275impl TDCallState for CallStateExchangingKeys {}
276
277impl CallStateExchangingKeys {
278    pub fn from_json<S: AsRef<str>>(json: S) -> Result<Self> {
279        Ok(serde_json::from_str(json.as_ref())?)
280    }
281    pub fn builder() -> CallStateExchangingKeysBuilder {
282        let mut inner = CallStateExchangingKeys::default();
283        inner.extra = Some(Uuid::new_v4().to_string());
284
285        CallStateExchangingKeysBuilder { inner }
286    }
287}
288
289#[doc(hidden)]
290pub struct CallStateExchangingKeysBuilder {
291    inner: CallStateExchangingKeys,
292}
293
294#[deprecated]
295pub type RTDCallStateExchangingKeysBuilder = CallStateExchangingKeysBuilder;
296
297impl CallStateExchangingKeysBuilder {
298    pub fn build(&self) -> CallStateExchangingKeys {
299        self.inner.clone()
300    }
301}
302
303impl AsRef<CallStateExchangingKeys> for CallStateExchangingKeys {
304    fn as_ref(&self) -> &CallStateExchangingKeys {
305        self
306    }
307}
308
309impl AsRef<CallStateExchangingKeys> for CallStateExchangingKeysBuilder {
310    fn as_ref(&self) -> &CallStateExchangingKeys {
311        &self.inner
312    }
313}
314
315/// The call is hanging up after discardCall has been called
316#[derive(Debug, Clone, Default, Serialize, Deserialize)]
317pub struct CallStateHangingUp {
318    #[doc(hidden)]
319    #[serde(rename(serialize = "@extra", deserialize = "@extra"))]
320    extra: Option<String>,
321    #[serde(rename(serialize = "@client_id", deserialize = "@client_id"))]
322    client_id: Option<i32>,
323}
324
325impl RObject for CallStateHangingUp {
326    #[doc(hidden)]
327    fn extra(&self) -> Option<&str> {
328        self.extra.as_deref()
329    }
330    #[doc(hidden)]
331    fn client_id(&self) -> Option<i32> {
332        self.client_id
333    }
334}
335
336impl TDCallState for CallStateHangingUp {}
337
338impl CallStateHangingUp {
339    pub fn from_json<S: AsRef<str>>(json: S) -> Result<Self> {
340        Ok(serde_json::from_str(json.as_ref())?)
341    }
342    pub fn builder() -> CallStateHangingUpBuilder {
343        let mut inner = CallStateHangingUp::default();
344        inner.extra = Some(Uuid::new_v4().to_string());
345
346        CallStateHangingUpBuilder { inner }
347    }
348}
349
350#[doc(hidden)]
351pub struct CallStateHangingUpBuilder {
352    inner: CallStateHangingUp,
353}
354
355#[deprecated]
356pub type RTDCallStateHangingUpBuilder = CallStateHangingUpBuilder;
357
358impl CallStateHangingUpBuilder {
359    pub fn build(&self) -> CallStateHangingUp {
360        self.inner.clone()
361    }
362}
363
364impl AsRef<CallStateHangingUp> for CallStateHangingUp {
365    fn as_ref(&self) -> &CallStateHangingUp {
366        self
367    }
368}
369
370impl AsRef<CallStateHangingUp> for CallStateHangingUpBuilder {
371    fn as_ref(&self) -> &CallStateHangingUp {
372        &self.inner
373    }
374}
375
376/// The call is pending, waiting to be accepted by a user
377#[derive(Debug, Clone, Default, Serialize, Deserialize)]
378pub struct CallStatePending {
379    #[doc(hidden)]
380    #[serde(rename(serialize = "@extra", deserialize = "@extra"))]
381    extra: Option<String>,
382    #[serde(rename(serialize = "@client_id", deserialize = "@client_id"))]
383    client_id: Option<i32>,
384    /// True, if the call has already been created by the server
385
386    #[serde(default)]
387    is_created: bool,
388    /// True, if the call has already been received by the other party
389
390    #[serde(default)]
391    is_received: bool,
392}
393
394impl RObject for CallStatePending {
395    #[doc(hidden)]
396    fn extra(&self) -> Option<&str> {
397        self.extra.as_deref()
398    }
399    #[doc(hidden)]
400    fn client_id(&self) -> Option<i32> {
401        self.client_id
402    }
403}
404
405impl TDCallState for CallStatePending {}
406
407impl CallStatePending {
408    pub fn from_json<S: AsRef<str>>(json: S) -> Result<Self> {
409        Ok(serde_json::from_str(json.as_ref())?)
410    }
411    pub fn builder() -> CallStatePendingBuilder {
412        let mut inner = CallStatePending::default();
413        inner.extra = Some(Uuid::new_v4().to_string());
414
415        CallStatePendingBuilder { inner }
416    }
417
418    pub fn is_created(&self) -> bool {
419        self.is_created
420    }
421
422    pub fn is_received(&self) -> bool {
423        self.is_received
424    }
425}
426
427#[doc(hidden)]
428pub struct CallStatePendingBuilder {
429    inner: CallStatePending,
430}
431
432#[deprecated]
433pub type RTDCallStatePendingBuilder = CallStatePendingBuilder;
434
435impl CallStatePendingBuilder {
436    pub fn build(&self) -> CallStatePending {
437        self.inner.clone()
438    }
439
440    pub fn is_created(&mut self, is_created: bool) -> &mut Self {
441        self.inner.is_created = is_created;
442        self
443    }
444
445    pub fn is_received(&mut self, is_received: bool) -> &mut Self {
446        self.inner.is_received = is_received;
447        self
448    }
449}
450
451impl AsRef<CallStatePending> for CallStatePending {
452    fn as_ref(&self) -> &CallStatePending {
453        self
454    }
455}
456
457impl AsRef<CallStatePending> for CallStatePendingBuilder {
458    fn as_ref(&self) -> &CallStatePending {
459        &self.inner
460    }
461}
462
463/// The call is ready to use
464#[derive(Debug, Clone, Default, Serialize, Deserialize)]
465pub struct CallStateReady {
466    #[doc(hidden)]
467    #[serde(rename(serialize = "@extra", deserialize = "@extra"))]
468    extra: Option<String>,
469    #[serde(rename(serialize = "@client_id", deserialize = "@client_id"))]
470    client_id: Option<i32>,
471    /// Call protocols supported by the peer
472    protocol: CallProtocol,
473    /// List of available call servers
474
475    #[serde(default)]
476    servers: Vec<CallServer>,
477    /// A JSON-encoded call config
478
479    #[serde(default)]
480    config: String,
481    /// Call encryption key
482
483    #[serde(default)]
484    encryption_key: String,
485    /// Encryption key emojis fingerprint
486
487    #[serde(default)]
488    emojis: Vec<String>,
489    /// True, if peer-to-peer connection is allowed by users privacy settings
490
491    #[serde(default)]
492    allow_p2p: bool,
493}
494
495impl RObject for CallStateReady {
496    #[doc(hidden)]
497    fn extra(&self) -> Option<&str> {
498        self.extra.as_deref()
499    }
500    #[doc(hidden)]
501    fn client_id(&self) -> Option<i32> {
502        self.client_id
503    }
504}
505
506impl TDCallState for CallStateReady {}
507
508impl CallStateReady {
509    pub fn from_json<S: AsRef<str>>(json: S) -> Result<Self> {
510        Ok(serde_json::from_str(json.as_ref())?)
511    }
512    pub fn builder() -> CallStateReadyBuilder {
513        let mut inner = CallStateReady::default();
514        inner.extra = Some(Uuid::new_v4().to_string());
515
516        CallStateReadyBuilder { inner }
517    }
518
519    pub fn protocol(&self) -> &CallProtocol {
520        &self.protocol
521    }
522
523    pub fn servers(&self) -> &Vec<CallServer> {
524        &self.servers
525    }
526
527    pub fn config(&self) -> &String {
528        &self.config
529    }
530
531    pub fn encryption_key(&self) -> &String {
532        &self.encryption_key
533    }
534
535    pub fn emojis(&self) -> &Vec<String> {
536        &self.emojis
537    }
538
539    pub fn allow_p2p(&self) -> bool {
540        self.allow_p2p
541    }
542}
543
544#[doc(hidden)]
545pub struct CallStateReadyBuilder {
546    inner: CallStateReady,
547}
548
549#[deprecated]
550pub type RTDCallStateReadyBuilder = CallStateReadyBuilder;
551
552impl CallStateReadyBuilder {
553    pub fn build(&self) -> CallStateReady {
554        self.inner.clone()
555    }
556
557    pub fn protocol<T: AsRef<CallProtocol>>(&mut self, protocol: T) -> &mut Self {
558        self.inner.protocol = protocol.as_ref().clone();
559        self
560    }
561
562    pub fn servers(&mut self, servers: Vec<CallServer>) -> &mut Self {
563        self.inner.servers = servers;
564        self
565    }
566
567    pub fn config<T: AsRef<str>>(&mut self, config: T) -> &mut Self {
568        self.inner.config = config.as_ref().to_string();
569        self
570    }
571
572    pub fn encryption_key<T: AsRef<str>>(&mut self, encryption_key: T) -> &mut Self {
573        self.inner.encryption_key = encryption_key.as_ref().to_string();
574        self
575    }
576
577    pub fn emojis(&mut self, emojis: Vec<String>) -> &mut Self {
578        self.inner.emojis = emojis;
579        self
580    }
581
582    pub fn allow_p2p(&mut self, allow_p2p: bool) -> &mut Self {
583        self.inner.allow_p2p = allow_p2p;
584        self
585    }
586}
587
588impl AsRef<CallStateReady> for CallStateReady {
589    fn as_ref(&self) -> &CallStateReady {
590        self
591    }
592}
593
594impl AsRef<CallStateReady> for CallStateReadyBuilder {
595    fn as_ref(&self) -> &CallStateReady {
596        &self.inner
597    }
598}