use super::string_like;
use crate::ChzzkDateTime;
use std::ops::Deref;
string_like! {ChannelId} string_like! {ChatChannelId}
#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq, Hash, Default)]
pub struct Channel {
#[serde(rename = "channelId")]
pub channel_id: ChannelId,
#[serde(rename = "channelName")]
pub channel_name: String,
#[serde(rename = "channelImageUrl")]
pub channel_image_url: Option<String>,
#[serde(rename = "verifiedMark")]
pub verified_mark: bool,
#[serde(rename = "channelType")]
pub channel_type: String,
#[serde(rename = "channelDescription")]
pub channel_description: String,
#[serde(rename = "followerCount")]
pub follower_count: usize,
#[serde(rename = "openLive")]
pub open_live: bool,
#[serde(rename = "subscriptionAvailability")]
pub subscription_availability: bool,
#[serde(rename = "subscriptionPaymentAvailability")]
pub subscription_payment_availability: SubscriptionPaymentAvailability,
#[serde(rename = "adMonetizationAvailability")]
pub ad_monetization_availability: bool,
}
#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq, Hash, Default)]
pub struct SubscriptionPaymentAvailability {
#[serde(rename = "iapAvailability")]
pub iap_availability: bool,
#[serde(rename = "iabAvailability")]
pub iab_availability: bool,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Default)]
pub enum LiveStatus {
#[default]
Close,
Open,
}
impl<'de> serde::Deserialize<'de> for LiveStatus {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let s = String::deserialize(deserializer)?;
match s.as_str() {
"CLOSE" => Ok(LiveStatus::Close),
"OPEN" => Ok(LiveStatus::Open),
_ => Err(serde::de::Error::custom("unexpected value")),
}
}
}
#[derive(serde::Deserialize, Debug, Clone, PartialEq, Eq, Hash, Default)]
pub struct ChannelLiveStatus {
#[serde(rename = "liveTitle")]
pub live_title: String,
pub status: LiveStatus,
#[serde(rename = "concurrentUserCount")]
pub concurrent_user_count: i32,
#[serde(rename = "accumulateCount")]
pub accumulate_count: i32,
#[serde(rename = "paidPromotion")]
pub paid_promotion: bool,
pub adult: bool,
#[serde(rename = "krOnlyViewing")]
pub kr_only_viewing: bool,
#[serde(rename = "openDate")]
pub open_date: Option<ChzzkDateTime>,
#[serde(rename = "closeDate")]
pub close_date: Option<ChzzkDateTime>,
#[serde(rename = "clipActive")]
pub clip_active: bool,
#[serde(rename = "chatChannelId")]
pub chat_channel_id: ChatChannelId,
pub tags: Vec<String>,
#[serde(rename = "categoryType")]
pub category_type: Option<String>,
#[serde(rename = "liveCategory")]
pub live_category: Option<String>,
#[serde(rename = "liveCategoryValue")]
pub live_category_value: String,
#[serde(rename = "userAdultStatus")]
pub user_adult_status: String,
#[serde(rename = "chatActive")]
pub chat_active: bool,
#[serde(rename = "chatAvailableGroup")]
pub chat_available_group: String,
#[serde(rename = "chatAvailableCondition")]
pub chat_available_condition: String,
#[serde(rename = "minFollowerMinute")]
pub min_follower_minute: i32,
#[serde(rename = "allowSubscriberInFollowerMode")]
pub allow_subscriber_in_follower_mode: bool,
#[serde(rename = "chatDonationRankingExposure")]
pub chat_donation_ranking_exposure: bool,
}
impl ChannelLiveStatus {
pub fn open_or<E>(self, err: E) -> Result<Self, E> {
if self.status == LiveStatus::Open {
Ok(self)
} else {
Err(err)
}
}
}
#[derive(serde::Serialize, serde::Deserialize, Debug, Clone, PartialEq, Eq, Hash, Default)]
pub struct ChatAccessToken {
#[serde(rename = "accessToken")]
pub access_token: String,
#[serde(rename = "realNameAuth")]
pub real_name_auth: bool,
#[serde(rename = "extraToken")]
pub extra_token: String,
}