twitch_highway 0.2.1

Twitch API
Documentation
pub mod request;
pub mod response;
pub mod types;

use crate::{
    conduits::{request::UpdateConduitShardsRequest, response::ConduitResponse},
    request::NoContent,
    types::{constants::EVENTSUB, ConduitId, Status},
};

const CONDUITS: &str = "conduits";

endpoints! {
    ConduitsAPI {
        fn get_conduits (&self) -> ConduitResponse {
            endpoint_type: GetConduits,
            method: GET,
            path: [EVENTSUB, CONDUITS],
        }

        fn create_conduits(&self, shard_count: u64) -> ConduitResponse {
            endpoint_type: CreateConduits,
            method: POST,
            path: [EVENTSUB, CONDUITS],
            headers: [json],
            body: {
                let body = serde_json::json!({
                    "shard_count": shard_count
                });

                Some(serde_json::to_string(&body).unwrap())
            }
        }

        fn update_conduits(
            &self,
            conduit_id: &ConduitId,
            shard_count: u64,
        ) -> ConduitResponse {
            endpoint_type: UpdateConduits,
            method: PATCH,
            path: [EVENTSUB, CONDUITS],
            headers: [json],
            body: {
                let body = serde_json::json!({
                    "id": conduit_id,
                    "shard_count": shard_count
                });

                Some(serde_json::to_string(&body).unwrap())
            }
        }

        fn delete_conduits(&self, conduit_id: &ConduitId) -> NoContent {
            endpoint_type: DeleteConduit,
            method: DELETE,
            path: [EVENTSUB, CONDUITS],
            query_params: {
                query("id", conduit_id)
            }
        }

        fn get_conduit_shards(&self,
            conduit_id: &ConduitId,
            status: Option<Status>,
            after: Option<&str>,
        ) -> serde_json::Value {
            endpoint_type: GetConduitShards,
            method: GET,
            path: [EVENTSUB, CONDUITS, "shards"],
            query_params: {
                query("conduit_id", conduit_id),
                opt("status", status),
                opt("after", after)
            }
        }

        fn update_conduit_shards(
            &self,
            req: UpdateConduitShardsRequest,
        ) -> serde_json::Value {
            endpoint_type: UpdateConduitShards,
            method: PATCH,
            path: [EVENTSUB, CONDUITS, "shards"],
            headers: [json],
            body: req.into_json()
        }

    }
}

#[cfg(test)]
mod tests {
    use crate::{
        conduits::{
            request::{Shard, UpdateConduitShardsRequest},
            ConduitsAPI,
        },
        types::ConduitId,
    };

    api_test!(get_conduits, []);
    api_test!(create_conduits, [5]);
    api_test!(
        update_conduits,
        [&ConduitId::from("bfcfc993-26b1-b876-44d9-afe75a379dac"), 5]
    );
    api_test!(
        delete_conduits,
        [&ConduitId::from("bfcfc993-26b1-b876-44d9-afe75a379dac")]
    );
    api_test!(
        get_conduit_shards,
        [
            &ConduitId::from("bfcfc993-26b1-b876-44d9-afe75a379dac"),
            None,
            None
        ]
    );
    api_test!(
        update_conduit_shards,
        [
            UpdateConduitShardsRequest::new(ConduitId::from(
                "bfcfc993-26b1-b876-44d9-afe75a379dac"
            ))
            .extend_shards([
                Shard::webhook(
                    "0".to_string(),
                    Some("https://this-is-a-callback.com".to_string()),
                    Some("s3cre7".to_string())
                ),
                Shard::webhook(
                    "1".to_string(),
                    Some("https://this-is-a-callback-2.com".to_string()),
                    Some("s3cre7".to_string())
                ),
                Shard::webhook(
                    "3".to_string(),
                    Some("https://this-is-a-callback-3.com".to_string()),
                    Some("s3cre7".to_string())
                ),
            ])
        ]
    );
}