1use super::string_like;
2use crate::ChzzkDateTime;
3use std::ops::Deref;
4
5string_like! {ChannelId} string_like! {ChatChannelId} #[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq, Hash, Default)]
9pub struct Channel {
10 #[serde(rename = "channelId")]
11 pub channel_id: ChannelId,
12 #[serde(rename = "channelName")]
13 pub channel_name: String,
14 #[serde(rename = "channelImageUrl")]
15 pub channel_image_url: Option<String>,
16 #[serde(rename = "verifiedMark")]
17 pub verified_mark: bool,
18 #[serde(rename = "channelType")]
19 pub channel_type: String,
20 #[serde(rename = "channelDescription")]
21 pub channel_description: String,
22 #[serde(rename = "followerCount")]
23 pub follower_count: usize,
24 #[serde(rename = "openLive")]
25 pub open_live: bool,
26 #[serde(rename = "subscriptionAvailability")]
27 pub subscription_availability: bool,
28 #[serde(rename = "subscriptionPaymentAvailability")]
29 pub subscription_payment_availability: SubscriptionPaymentAvailability,
30 #[serde(rename = "adMonetizationAvailability")]
31 pub ad_monetization_availability: bool,
32 }
35
36#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq, Hash, Default)]
37pub struct SubscriptionPaymentAvailability {
38 #[serde(rename = "iapAvailability")]
39 pub iap_availability: bool,
40 #[serde(rename = "iabAvailability")]
41 pub iab_availability: bool,
42}
43
44#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
45pub enum LiveStatus {
46 #[default]
47 Close,
48 Open,
49}
50
51impl<'de> serde::Deserialize<'de> for LiveStatus {
52 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
53 where
54 D: serde::Deserializer<'de>,
55 {
56 let s = String::deserialize(deserializer)?;
57 match s.as_str() {
58 "CLOSE" => Ok(LiveStatus::Close),
59 "OPEN" => Ok(LiveStatus::Open),
60 _ => Err(serde::de::Error::custom("unexpected value")),
61 }
62 }
63}
64
65#[derive(serde::Deserialize, Debug, Clone, PartialEq, Eq, Hash, Default)]
66pub struct ChannelLiveStatus {
67 #[serde(rename = "liveTitle")]
68 pub live_title: String,
69 pub status: LiveStatus,
70 #[serde(rename = "concurrentUserCount")]
71 pub concurrent_user_count: i32,
72 #[serde(rename = "accumulateCount")]
73 pub accumulate_count: i32,
74 #[serde(rename = "paidPromotion")]
75 pub paid_promotion: bool,
76 pub adult: bool,
77 #[serde(rename = "krOnlyViewing")]
78 pub kr_only_viewing: bool,
79 #[serde(rename = "openDate")]
80 pub open_date: Option<ChzzkDateTime>,
81 #[serde(rename = "closeDate")]
82 pub close_date: Option<ChzzkDateTime>,
83 #[serde(rename = "clipActive")]
84 pub clip_active: bool,
85 #[serde(rename = "chatChannelId")]
86 pub chat_channel_id: ChatChannelId,
87 pub tags: Vec<String>,
88 #[serde(rename = "categoryType")]
89 pub category_type: Option<String>,
90 #[serde(rename = "liveCategory")]
91 pub live_category: Option<String>,
92 #[serde(rename = "liveCategoryValue")]
93 pub live_category_value: String,
94 #[serde(rename = "userAdultStatus")]
97 pub user_adult_status: String,
98 #[serde(rename = "chatActive")]
103 pub chat_active: bool,
104 #[serde(rename = "chatAvailableGroup")]
105 pub chat_available_group: String,
106 #[serde(rename = "chatAvailableCondition")]
107 pub chat_available_condition: String,
108 #[serde(rename = "minFollowerMinute")]
109 pub min_follower_minute: i32,
110 #[serde(rename = "allowSubscriberInFollowerMode")]
111 pub allow_subscriber_in_follower_mode: bool,
112 #[serde(rename = "chatDonationRankingExposure")]
113 pub chat_donation_ranking_exposure: bool,
114 }
123
124impl ChannelLiveStatus {
125 pub fn open_or<E>(self, err: E) -> Result<Self, E> {
126 if self.status == LiveStatus::Open {
127 Ok(self)
128 } else {
129 Err(err)
130 }
131 }
132}
133
134#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq, Hash, Default)]
135pub struct ChatAccessToken {
136 #[serde(rename = "accessToken")]
137 pub access_token: String,
138 #[serde(rename = "realNameAuth")]
141 pub real_name_auth: bool,
142 #[serde(rename = "extraToken")]
143 pub extra_token: String,
144}