twitch_highway 0.3.2

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

use crate::types::{BroadcasterId, Choice, PollId};

#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Poll {
    pub id: PollId,
    pub broadcaster_id: BroadcasterId,
    pub broadcaster_name: String,
    pub broadcaster_login: String,
    pub title: String,
    pub choices: Vec<Choice>,
    pub bits_voting_enabled: bool,
    pub bits_per_vote: u64,
    pub channel_points_voting_enabled: bool,
    pub channel_points_per_vote: u64,
    pub status: PollStatus,
    pub duration: u64,
    pub started_at: DateTime<FixedOffset>,
    pub ended_at: Option<DateTime<FixedOffset>>,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum EndPollStatus {
    TERMINATED,
    ARCHIVED,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum PollStatus {
    ACTIVE,
    COMPLETED,
    TERMINATED,
    ARCHIVED,
    MODERATED,
    INVALID,
}

#[derive(Serialize)]
pub(crate) struct EndPollBody<'a> {
    pub broadcaster_id: &'a BroadcasterId,
    pub id: &'a PollId,
    pub status: EndPollStatus,
}

#[cfg(test)]
mod tests {
    use crate::polls::PollStatus;

    #[test]
    fn poll_status_enum() {
        let statuses = vec![
            PollStatus::ACTIVE,
            PollStatus::COMPLETED,
            PollStatus::TERMINATED,
            PollStatus::ARCHIVED,
            PollStatus::MODERATED,
            PollStatus::INVALID,
        ];

        for status in statuses {
            let serialized = serde_json::to_string(&status).unwrap();
            let deserialized: PollStatus = serde_json::from_str(&serialized).unwrap();

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