twitch_highway 0.2.1

Twitch API
Documentation
use serde::{Deserialize, Serialize};

use crate::types::UserId;

define_request!(
    #[derive(Serialize)]
    CheckAutoModStatusRequest<'a> {
        req: {
            data: &'a [CheckAutoMod]
        };
        into_json
    }
);

define_request!(
    #[derive(Serialize, Deserialize)]
     CheckAutoMod {
        req: {
            msg_id: String | into,
            msg_text: String | into,
        }
    }
);

define_request!(
    #[derive(Serialize)]
     ManageHeldAutoModMeussageRequest<'a> {
        req: {
            user_id: &'a UserId,
            msg_id: &'a str,
            action: AutoModAction
        };
        into_json
    }
);

#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
pub enum AutoModAction {
    ALLOW,
    DENY,
}

define_request!(
    #[derive(Default, Serialize)]
    UpdateAutoModSettingsRequest {
        opts: {
            #[serde(skip_serializing_if = "Option::is_none")]
            aggression: u64,
            #[serde(skip_serializing_if = "Option::is_none")]
            bullying: u64,
            #[serde(skip_serializing_if = "Option::is_none")]
            disability: u64,
            #[serde(skip_serializing_if = "Option::is_none")]
            misogyny: u64,
            #[serde(skip_serializing_if = "Option::is_none")]
            overall_level: u64,
            #[serde(skip_serializing_if = "Option::is_none")]
            race_ethnicity_or_religion: u64,
            #[serde(skip_serializing_if = "Option::is_none")]
            sex_based_terms: u64,
            #[serde(skip_serializing_if = "Option::is_none")]
            sexuality_sex_or_gender: u64,
            #[serde(skip_serializing_if = "Option::is_none")]
            swearing: u64,
        };
        into_json
    }
);

define_request!(
    #[derive(Serialize)]
    BanUserRequest<'a> {
        req: {
            user_id: &'a UserId
        },
        opts: {
            #[serde(skip_serializing_if = "Option::is_none")]
            duration: u64,
            #[serde(skip_serializing_if = "Option::is_none")]
            reason: &'a str
       }
    }
);

define_request!(
    #[derive(Serialize)]
    BanUserRequestWrapper<'a>{
        req: {
            data: BanUserRequest<'a>
        };
        into_json
    }
);

define_request!(
    #[derive(Serialize)]
    AddBlockedTermRequest<'a> {
        req: {
            text: &'a str
        };
        into_json
    }
);

define_request!(
    #[derive(Serialize)]
    UpdateShieldModeStatusRequest {
        req: {
            is_active: bool
        };
        into_json
    }
);

define_request!(
    #[derive(Serialize)]
    WarnChatUserRequest<'a> {
        req: {
            data: WarnChatUser<'a>
        };
        into_json
    }
);

define_request!(
    #[derive(Serialize)]
    WarnChatUser<'a> {
        req: {
            user_id: &'a UserId,
            reason: &'a str
        }
    }
);

#[cfg(test)]
mod tests {
    use crate::moderation::request::AutoModAction;

    #[test]
    fn automod_action_enum() {
        let actions = vec![
            (AutoModAction::ALLOW, "ALLOW"),
            (AutoModAction::DENY, "DENY"),
        ];

        for (action, expected_str) in actions {
            let serialized = serde_json::to_string(&action).unwrap();
            assert_eq!(serialized, format!("\"{}\"", expected_str));

            let deserialized: AutoModAction = serde_json::from_str(&serialized).unwrap();
            let re_serialized = serde_json::to_string(&deserialized).unwrap();
            assert_eq!(serialized, re_serialized);
        }
    }
}