use serde::Deserialize; use serde_with::{serde_as, VecSkipError}; use crate::serializer::{ignore_any, MapResult, VecLogError}; use super::{ContentRenderer, ContentsRenderer, VideoListItem, VideoRenderer}; #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct Startpage { pub contents: Contents, pub response_context: ResponseContext, } #[serde_as] #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct StartpageCont { #[serde(default)] #[serde_as(as = "VecSkipError<_>")] pub on_response_received_actions: Vec, } #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct Contents { pub two_column_browse_results_renderer: T, } #[serde_as] #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct BrowseResultsStartpage { #[serde_as(as = "VecSkipError<_>")] pub tabs: Vec>, } #[serde_as] #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct BrowseResultsTrends { #[serde_as(as = "VecSkipError<_>")] pub tabs: Vec>, } #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct Tab { pub tab_renderer: ContentRenderer, } #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct StartpageTabContent { pub rich_grid_renderer: RichGridRenderer, } #[serde_as] #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct RichGridRenderer { #[serde_as(as = "VecLogError<_>")] pub contents: MapResult>, } #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct Trending { pub contents: Contents, } #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct TrendingTabContent { pub section_list_renderer: ContentsRenderer, } #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ItemSectionRenderer { pub item_section_renderer: ContentsRenderer, } #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ShelfRenderer { pub shelf_renderer: ContentRenderer, } #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ShelfContents { pub expanded_shelf_contents_renderer: Option, } #[serde_as] #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ShelfContentsRenderer { #[serde_as(as = "VecLogError<_>")] pub items: MapResult>, } #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct ResponseContext { pub visitor_data: Option, } #[serde_as] #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] #[allow(clippy::large_enum_variant)] pub enum TrendingListItem { VideoRenderer(VideoRenderer), #[serde(other, deserialize_with = "ignore_any")] None, } #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct OnResponseReceivedAction { pub append_continuation_items_action: AppendAction, } #[serde_as] #[derive(Debug, Deserialize)] #[serde(rename_all = "camelCase")] pub struct AppendAction { #[serde_as(as = "VecLogError<_>")] pub continuation_items: MapResult>, }