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
mod rc;

use anyhow::Result;
use rc::{parse_from_str, ZulipRuntimeConfig};
use serde::{Deserialize, Serialize};

#[derive(Serialize, Deserialize, Debug)]
#[serde(tag = "result")]
pub enum SendMessageResponse {
    #[serde(rename = "success")]
    Success { id: i64, msg: String },
    #[serde(rename = "error")]
    Error {
        code: String,
        msg: String,
        stream: Option<String>,
    },
}

#[derive(Serialize, Debug)]
#[serde(tag = "type")]
pub enum Message {
    #[serde(rename = "stream")]
    Stream {
        to: String,
        topic: String,
        content: String,
    },
    #[serde(rename = "private")]
    Private { to: String, content: String },
}

pub struct Client {
    rc: ZulipRuntimeConfig,
}

impl Client {
    pub fn new(rc_str: &str) -> Result<Self> {
        let rc = parse_from_str(rc_str)?;
        Ok(Client { rc })
    }
    pub async fn send_message(&self, msg: Message) -> Result<SendMessageResponse> {
        let client = reqwest::Client::new();
        let result = client
            .post(&format!("{}/api/v1/messages", &self.rc.api.site))
            .basic_auth(&self.rc.api.email, Some(&self.rc.api.key))
            .header("application", "x-www-form-urlencoded")
            .form(&msg)
            .send()
            .await?;
        let resp: SendMessageResponse = result.json().await?;
        Ok(resp)
    }
}