1use crate::builder::PollBuilder;
6use crate::TitanString;
7use serde::{Deserialize, Serialize};
8
9#[derive(Debug, Clone, Deserialize, Serialize)]
11pub struct Poll<'a> {
12 pub question: PollMedia<'a>,
14
15 pub answers: Vec<PollAnswer<'a>>,
17
18 #[serde(default)]
20 pub expiry: Option<TitanString<'a>>,
21
22 #[serde(default)]
24 pub allow_multiselect: bool,
25
26 #[serde(default)]
28 pub layout_type: Option<u8>,
29
30 #[serde(default)]
32 pub results: Option<PollResults>,
33}
34
35impl<'a> Poll<'a> {
36 pub fn builder(question: impl Into<TitanString<'a>>) -> PollBuilder<'a> {
38 PollBuilder::new(question)
39 }
40}
41
42#[derive(Debug, Clone, Deserialize, Serialize)]
44pub struct PollMedia<'a> {
45 #[serde(default)]
47 pub text: Option<TitanString<'a>>,
48
49 #[serde(default)]
51 pub emoji: Option<crate::member::Emoji<'a>>,
52}
53
54#[derive(Debug, Clone, Deserialize, Serialize)]
56pub struct PollAnswer<'a> {
57 #[serde(default)]
59 pub answer_id: Option<u32>, pub poll_media: PollMedia<'a>,
64}
65
66#[derive(Debug, Clone, Deserialize, Serialize)]
68pub struct PollResults {
69 #[serde(default)]
71 pub is_finalized: bool,
72
73 #[serde(default)]
75 pub answer_counts: Vec<PollAnswerCount>,
76}
77
78#[derive(Debug, Clone, Deserialize, Serialize)]
80pub struct PollAnswerCount {
81 pub id: u32,
83
84 pub count: u32,
86
87 #[serde(default)]
89 pub me_voted: bool,
90}