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
use opentok::utils::common::Credentials;
use std::collections::HashMap;
use url::Url;

pub async fn parse_cli() -> Result<(Credentials, Option<u64>), anyhow::Error> {
    let yaml = yaml_rust::Yaml::Array(yaml_rust::YamlLoader::load_from_str(include_str!(
        "cli.yaml"
    ))?);
    let mut app = clap_serde::yaml_to_app(&yaml)?;

    let matches = app.clone().get_matches();

    let mut credentials = Credentials::default();
    if let Some(room_url) = matches.value_of("url") {
        let info_url = format!("{}/info", room_url);
        let payload = surf::get(&info_url)
            .recv_string()
            .await
            .map_err(|e| anyhow::anyhow!("{}", e))?;
        let json = json::parse(&payload).expect("Invalid JSON");
        credentials.api_key = json["apiKey"].as_str().unwrap().into();
        credentials.session_id = json["sessionId"].as_str().unwrap().into();
        credentials.token = json["token"].as_str().unwrap().into();
    } else if let Some(url) = matches.value_of("opentok_url") {
        let url = Url::parse(url).unwrap();
        let query_params: HashMap<_, _> = url.query_pairs().into_owned().collect();

        credentials.api_key = query_params.get("key").cloned().unwrap_or_default();
        credentials.token = query_params.get("token").cloned().unwrap_or_default();
        credentials.session_id = url.host().map(|s| s.to_string()).unwrap_or_default();
    } else {
        if let Some(api_key) = matches.value_of("api_key") {
            credentials.api_key = api_key.into();
        }
        if let Some(session_id) = matches.value_of("session_id") {
            credentials.session_id = session_id.into();
        }
        if let Some(token) = matches.value_of("token") {
            credentials.token = token.into();
        }
    }

    if credentials.api_key.is_empty()
        || credentials.session_id.is_empty()
        || credentials.token.is_empty()
    {
        app.print_help().unwrap();
        return Err(anyhow::anyhow!("Failed to parse arguments"));
    }

    let duration = matches
        .value_of("duration")
        .map(|s| s.parse::<u64>().unwrap());

    Ok((credentials, duration))
}