concord 2.5.1

A terminal user interface client for Discord
use serde_json::{Value, json};

use super::DiscordRest;
use crate::Result;

impl DiscordRest {
    pub(in crate::discord) async fn upload_stream_preview(
        &self,
        stream_key: &str,
        thumbnail_data_uri: &str,
    ) -> Result<()> {
        self.send_unit(
            self.raw_http
                .post(stream_preview_endpoint(stream_key))
                .json(&stream_preview_request_body(thumbnail_data_uri)),
            "upload stream preview",
        )
        .await
    }
}

fn stream_preview_endpoint(stream_key: &str) -> String {
    format!("https://discord.com/api/v9/streams/{stream_key}/preview")
}

fn stream_preview_request_body(thumbnail_data_uri: &str) -> Value {
    json!({ "thumbnail": thumbnail_data_uri })
}

#[cfg(test)]
mod tests {
    use super::*;

    #[test]
    fn stream_preview_request_matches_discord_endpoint_and_body() {
        let stream_key = "guild:123:456:789";
        let thumbnail = "data:image/jpeg;base64,cHJldmlldw==";

        assert_eq!(
            stream_preview_endpoint(stream_key),
            "https://discord.com/api/v9/streams/guild:123:456:789/preview"
        );
        assert_eq!(
            stream_preview_request_body(thumbnail),
            json!({ "thumbnail": thumbnail })
        );
    }
}