use std::any::Any; use std::error::Error; use std::fmt::Debug; use chrono::DateTime; use chrono::Utc; use google_bigquery::utils::ConvertValueToBigqueryParamValue; use google_bigquery::{ BigDataTable, BigDataTableBase, BigDataTableBaseConvenience, BigDataTableDerive, BigDataTableHasPk, BigqueryClient, HasBigQueryClient, HasBigQueryClientDerive, }; #[derive(BigDataTableDerive, HasBigQueryClientDerive)] #[db_name("streamers")] pub struct Streamers<'a> { #[primary_key] #[required] pub login: String, #[client] pub client: Option<&'a BigqueryClient>, pub display_name: Option, pub watched: Option, pub youtube_user: Option, pub public_videos_default: Option, } impl Debug for Streamers<'_> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("Streamers") .field("login", &self.login) .field("display_name", &self.display_name) .field("watched", &self.watched) .field("youtube_user", &self.youtube_user) .finish() } } /*impl<'a> Streamers<'a> { pub fn get_watched(&self) -> String { self.login.clone() } fn get_pk_value(&self) -> String { self.login.clone() } }*/ impl Default for Streamers<'_> { fn default() -> Self { Self { login: "".to_string(), client: None, display_name: None, watched: None, youtube_user: None, public_videos_default: None, } } } #[derive(BigDataTableDerive, HasBigQueryClientDerive)] #[db_name("videos")] pub struct Videos<'a> { #[primary_key] #[required] pub video_id: i64, #[client] pub client: Option<&'a BigqueryClient>, pub title: Option, pub description: Option, pub bool_test: Option, pub user_login: Option, pub created_at: Option>, pub url: Option, pub viewable: Option, pub language: Option, pub view_count: Option, pub video_type: Option, pub duration: Option, pub thumbnail_url: Option, } impl Debug for Videos<'_> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("Videos") .field("video_id", &self.video_id) .field("title", &self.title) .field("description", &self.description) .field("bool_test", &self.bool_test) .field("user_login", &self.user_login) .field("created_at", &self.created_at) .field("url", &self.url) .field("viewable", &self.viewable) .field("language", &self.language) .field("view_count", &self.view_count) .field("video_type", &self.video_type) .field("duration", &self.duration) .field("thumbnail_url", &self.thumbnail_url) .finish() } } impl Default for Videos<'_> { fn default() -> Self { Self { video_id: -9999, client: None, title: None, description: None, bool_test: None, user_login: None, created_at: None, url: None, viewable: None, language: None, view_count: None, video_type: None, duration: None, thumbnail_url: None, } } } #[derive(BigDataTableDerive, HasBigQueryClientDerive)] #[db_name("video_metadata")] pub struct VideoMetadata<'a> { #[primary_key] #[required] pub video_id: i64, #[client] pub client: Option<&'a BigqueryClient>, pub backed_up: Option, pub total_clips_amount: Option, pub parts_backed_up_id: Option, pub parts_size: Option, pub error: Option, pub download_playlist_url: Option, pub youtube_playlist_url: Option, } impl Debug for VideoMetadata<'_> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("VideoMetadata") .field("video_id", &self.video_id) .field("backed_up", &self.backed_up) .field("total_clips_amount", &self.total_clips_amount) .field("parts_backed_up_id", &self.parts_backed_up_id) .field("parts_size", &self.parts_size) .field("error", &self.error) .field("download_playlist_url", &self.download_playlist_url) .field("youtube_playlist_url", &self.youtube_playlist_url) .finish() } } impl Default for VideoMetadata<'_> { fn default() -> Self { Self { video_id: -9999, client: None, error: None, backed_up: None, total_clips_amount: None, parts_backed_up_id: None, parts_size: None, download_playlist_url: None, youtube_playlist_url: None, } } } #[derive(Debug, Default)] pub struct VideoData<'a> { pub video: Videos<'a>, pub metadata: VideoMetadata<'a>, pub streamer: Streamers<'a>, } impl<'a> VideoData<'a> { pub fn from_twitch_video( video: &twitch_data::Video, client: &'a BigqueryClient, ) -> Result> { Ok(Self { video: Videos { video_id: video.id.parse::()?, client: Some(client), title: Some(video.title.clone()), description: Some(video.description.clone()), bool_test: Some(true), user_login: Some(video.user_login.to_lowercase()), created_at: Some(video.created_at.clone()), url: Some(video.url.clone()), viewable: Some(video.viewable.clone()), language: Some(video.language.clone()), view_count: Some(video.view_count), video_type: Some("archive".to_string()), duration: Some(video.duration), thumbnail_url: Some(video.thumbnail_url.clone()), }, metadata: VideoMetadata { video_id: video.id.parse::()?, client: Some(client), backed_up: Some(false), ..Default::default() }, streamer: Streamers { ..Default::default() }, }) } }