1use crate::id::NumericId;
2use serde::{Deserialize, Serialize};
3use time::{Duration, OffsetDateTime};
4
5#[derive(Serialize, Deserialize, Debug, Clone, Eq, PartialEq)]
6pub struct PollOption {
7 pub position: usize,
8 pub label: String,
9 pub votes: usize,
10}
11
12#[derive(Serialize, Deserialize, Debug, Clone, Eq, PartialEq)]
13#[serde(rename_all = "snake_case")]
14pub enum PollVotingStatus {
15 Open,
16 Closed,
17}
18
19#[derive(Serialize, Deserialize, Debug, Clone, Eq, PartialEq)]
20pub struct Poll {
21 pub id: NumericId,
22 pub options: Vec<PollOption>,
23 #[serde(
24 with = "crate::utils::serde::option_duration_mins",
25 rename = "duration_minutes",
26 skip_serializing_if = "Option::is_none",
27 default
28 )]
29 pub duration: Option<Duration>,
30 #[serde(
31 default,
32 with = "time::serde::rfc3339::option",
33 skip_serializing_if = "Option::is_none"
34 )]
35 pub end_datetime: Option<OffsetDateTime>,
36 #[serde(skip_serializing_if = "Option::is_none")]
37 pub voting_status: Option<PollVotingStatus>,
38}