1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
use super::{encode_pairs, Execute, Twilio, TwilioErr, TwilioJson, TwilioRequest, TwilioResp};
use async_trait::async_trait;
use hyper::{self, Method};
use serde::Deserialize;

#[derive(Debug, Default)]
pub struct Conference<'a> {
    sid: &'a str,
    status: Option<&'a str>,
}

const COMPLETED: &str = "completed";

impl<'a> Conference<'a> {
    pub fn new(sid: &'a str) -> Conference<'a> {
        Conference { sid, status: None }
    }
}

// GET ONE CONFERENCE
#[derive(Debug)]
pub struct GetConference<'a> {
    pub conference: Conference<'a>,
    pub client: &'a Twilio,
}

impl<'a> GetConference<'a> {
    pub fn end(mut self) -> GetConference<'a> {
        self.conference.status = Some(COMPLETED);
        self
    }
}

execute!(GetConference);

#[async_trait]
impl<'a> TwilioRequest for GetConference<'a> {
    type Resp = ConferenceResp;

    async fn run(&self) -> TwilioResp<TwilioJson<Self::Resp>> {
        let url = format!("Conferences/{}.json", self.conference.sid);
        match self.conference.status {
            Some(status) => {
                self.execute(
                    Method::POST,
                    url,
                    Some(encode_pairs(&[("Status", status)]).unwrap()),
                )
                .await
            }
            None => self.execute(Method::GET, url, None).await,
        }
    }
}

// GET ALL CONFERENCES
#[derive(Debug)]
pub struct Conferences<'a> {
    pub client: &'a Twilio,
}

execute!(Conferences);

#[async_trait]
impl<'a> TwilioRequest for Conferences<'a> {
    type Resp = ListConferencesResp;

    async fn run(&self) -> TwilioResp<TwilioJson<Self::Resp>> {
        self.execute(Method::GET, "Conferences.json", None).await
    }
}

#[derive(Deserialize, Debug)]
pub struct ListConferencesResp {
    pub conferences: Vec<ConferenceResp>,
    pub end: usize,
    pub next_page_uri: Option<String>,
    pub previous_page_uri: Option<String>,
    pub uri: String,
    pub start: usize,
    pub page: usize,
    pub page_size: usize,
}

#[derive(Deserialize, Debug)]
pub struct ConferenceResp {
    pub account_sid: String,
    pub date_created: Option<String>,
    pub date_updated: String,
    pub friendly_name: String,
    pub region: String,
    pub sid: String,
    pub status: String,
    pub uri: String,
}