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) } }