refactor: use serde_with::rust::deserialize_ignore_any

This commit is contained in:
ThetaDev 2022-11-22 19:37:57 +01:00
parent 9501e95505
commit f7b7c1954c
7 changed files with 23 additions and 50 deletions

View file

@ -1,10 +1,8 @@
use serde::Deserialize; use serde::Deserialize;
use serde_with::serde_as; use serde_with::{rust::deserialize_ignore_any, serde_as, DefaultOnError, VecSkipError};
use serde_with::{DefaultOnError, VecSkipError};
use super::url_endpoint::NavigationEndpoint; use super::url_endpoint::NavigationEndpoint;
use super::{Alert, ChannelBadge, ContentsRenderer, ResponseContext, Thumbnails, YouTubeListItem}; use super::{Alert, ChannelBadge, ContentsRenderer, ResponseContext, Thumbnails, YouTubeListItem};
use crate::serializer::ignore_any;
use crate::serializer::{text::Text, MapResult, VecLogError}; use crate::serializer::{text::Text, MapResult, VecLogError};
#[serde_as] #[serde_as]
@ -108,7 +106,7 @@ pub(crate) enum ChannelContent {
}, },
ChannelAboutFullMetadataRenderer(ChannelFullMetadata), ChannelAboutFullMetadataRenderer(ChannelFullMetadata),
#[default] #[default]
#[serde(other, deserialize_with = "ignore_any")] #[serde(other, deserialize_with = "deserialize_ignore_any")]
None, None,
} }
@ -154,7 +152,7 @@ pub(crate) enum CarouselHeaderRendererItem {
#[serde(default)] #[serde(default)]
avatar: Thumbnails, avatar: Thumbnails,
}, },
#[serde(other, deserialize_with = "ignore_any")] #[serde(other, deserialize_with = "deserialize_ignore_any")]
None, None,
} }

View file

@ -1,5 +1,5 @@
use serde::Deserialize; use serde::Deserialize;
use serde_with::{serde_as, DefaultOnError, VecSkipError}; use serde_with::{rust::deserialize_ignore_any, serde_as, DefaultOnError, VecSkipError};
use crate::{ use crate::{
model::{ model::{
@ -8,7 +8,6 @@ use crate::{
}, },
param::Language, param::Language,
serializer::{ serializer::{
ignore_any,
text::{Text, TextComponents}, text::{Text, TextComponents},
MapResult, VecLogError, MapResult, VecLogError,
}, },
@ -31,7 +30,7 @@ pub(crate) enum ItemSection {
#[serde_as(as = "VecLogError<_>")] #[serde_as(as = "VecLogError<_>")]
contents: MapResult<Vec<MusicResponseItem>>, contents: MapResult<Vec<MusicResponseItem>>,
}, },
#[serde(other, deserialize_with = "ignore_any")] #[serde(other, deserialize_with = "deserialize_ignore_any")]
None, None,
} }
@ -201,7 +200,7 @@ pub(crate) struct PlaylistPanelRenderer {
#[serde(rename_all = "camelCase")] #[serde(rename_all = "camelCase")]
pub(crate) enum PlaylistPanelVideo { pub(crate) enum PlaylistPanelVideo {
PlaylistPanelVideoRenderer(QueueMusicItem), PlaylistPanelVideoRenderer(QueueMusicItem),
#[serde(other, deserialize_with = "ignore_any")] #[serde(other, deserialize_with = "deserialize_ignore_any")]
None, None,
} }

View file

@ -1,7 +1,7 @@
use serde::Deserialize; use serde::Deserialize;
use serde_with::{serde_as, VecSkipError}; use serde_with::{rust::deserialize_ignore_any, serde_as, VecSkipError};
use crate::serializer::{ignore_any, text::Text}; use crate::serializer::text::Text;
use super::{music_item::MusicShelf, ContentsRenderer, SectionList, Tab}; use super::{music_item::MusicShelf, ContentsRenderer, SectionList, Tab};
@ -28,7 +28,7 @@ pub(crate) enum ItemSection {
#[serde_as(as = "VecSkipError<_>")] #[serde_as(as = "VecSkipError<_>")]
contents: Vec<ShowingResultsFor>, contents: Vec<ShowingResultsFor>,
}, },
#[serde(other, deserialize_with = "ignore_any")] #[serde(other, deserialize_with = "deserialize_ignore_any")]
None, None,
} }

View file

@ -1,8 +1,10 @@
use serde::Deserialize; use serde::Deserialize;
use serde_with::{json::JsonString, serde_as, DefaultOnError, VecSkipError}; use serde_with::{
json::JsonString, rust::deserialize_ignore_any, serde_as, DefaultOnError, VecSkipError,
};
use crate::serializer::text::{Text, TextComponent}; use crate::serializer::text::{Text, TextComponent};
use crate::serializer::{ignore_any, MapResult, VecLogError}; use crate::serializer::{MapResult, VecLogError};
use crate::util::MappingError; use crate::util::MappingError;
use super::{ use super::{
@ -156,7 +158,7 @@ pub(crate) enum PlaylistItem {
continuation_endpoint: ContinuationEndpoint, continuation_endpoint: ContinuationEndpoint,
}, },
/// No video list item (e.g. ad) or unimplemented item /// No video list item (e.g. ad) or unimplemented item
#[serde(other, deserialize_with = "ignore_any")] #[serde(other, deserialize_with = "deserialize_ignore_any")]
None, None,
} }

View file

@ -1,12 +1,10 @@
#![allow(clippy::enum_variant_names)] #![allow(clippy::enum_variant_names)]
use serde::Deserialize; use serde::Deserialize;
use serde_with::serde_as; use serde_with::{rust::deserialize_ignore_any, serde_as, DefaultOnError, VecSkipError};
use serde_with::{DefaultOnError, VecSkipError};
use crate::serializer::text::TextComponent; use crate::serializer::text::TextComponent;
use crate::serializer::{ use crate::serializer::{
ignore_any,
text::{AccessibilityText, AttributedText, Text, TextComponents}, text::{AccessibilityText, AttributedText, Text, TextComponents},
MapResult, VecLogError, MapResult, VecLogError,
}; };
@ -102,7 +100,7 @@ pub(crate) enum VideoResultsItem {
/// 1. sectionIdentifier: "comments-entry-point", contains number of comments /// 1. sectionIdentifier: "comments-entry-point", contains number of comments
/// 2. sectionIdentifier: "comment-item-section", contains continuation token /// 2. sectionIdentifier: "comment-item-section", contains continuation token
ItemSectionRenderer(#[serde_as(deserialize_as = "DefaultOnError")] ItemSection), ItemSectionRenderer(#[serde_as(deserialize_as = "DefaultOnError")] ItemSection),
#[serde(other, deserialize_with = "ignore_any")] #[serde(other, deserialize_with = "deserialize_ignore_any")]
None, None,
} }
@ -335,7 +333,7 @@ pub(crate) enum EngagementPanelRenderer {
/// (Description already included in `VideoSecondaryInfoRenderer`) /// (Description already included in `VideoSecondaryInfoRenderer`)
/// - `engagement-panel-searchable-transcript` /// - `engagement-panel-searchable-transcript`
/// (basically video subtitles in a different format) /// (basically video subtitles in a different format)
#[serde(other, deserialize_with = "ignore_any")] #[serde(other, deserialize_with = "deserialize_ignore_any")]
None, None,
} }

View file

@ -1,7 +1,9 @@
use fancy_regex::Regex; use fancy_regex::Regex;
use once_cell::sync::Lazy; use once_cell::sync::Lazy;
use serde::Deserialize; use serde::Deserialize;
use serde_with::{json::JsonString, serde_as, DefaultOnError, VecSkipError}; use serde_with::{
json::JsonString, rust::deserialize_ignore_any, serde_as, DefaultOnError, VecSkipError,
};
use time::{Duration, OffsetDateTime}; use time::{Duration, OffsetDateTime};
use super::{ChannelBadge, ContinuationEndpoint, Thumbnails}; use super::{ChannelBadge, ContinuationEndpoint, Thumbnails};
@ -9,7 +11,6 @@ use crate::{
model::{Channel, ChannelId, ChannelItem, ChannelTag, PlaylistItem, VideoItem, YouTubeItem}, model::{Channel, ChannelId, ChannelItem, ChannelTag, PlaylistItem, VideoItem, YouTubeItem},
param::Language, param::Language,
serializer::{ serializer::{
ignore_any,
text::{AccessibilityText, Text, TextComponent}, text::{AccessibilityText, Text, TextComponent},
MapResult, VecLogError, MapResult, VecLogError,
}, },
@ -69,7 +70,7 @@ pub(crate) enum YouTubeListItem {
/// Unimplemented: /// Unimplemented:
/// - compactPlaylistRenderer (recommended playlists) /// - compactPlaylistRenderer (recommended playlists)
/// - compactRadioRenderer (recommended mix) /// - compactRadioRenderer (recommended mix)
#[serde(other, deserialize_with = "ignore_any")] #[serde(other, deserialize_with = "deserialize_ignore_any")]
None, None,
} }

View file

@ -10,8 +10,6 @@ pub use vec_log_err::VecLogError;
use std::fmt::Debug; use std::fmt::Debug;
use serde::{de::IgnoredAny, Deserializer};
/// This represents a result from a deserializing/mapping operation. /// This represents a result from a deserializing/mapping operation.
/// It holds the desired content (`c`) and a list of warning messages, /// It holds the desired content (`c`) and a list of warning messages,
/// if there occurred minor error during the deserializing or mapping /// if there occurred minor error during the deserializing or mapping
@ -43,33 +41,10 @@ where
} }
} }
/// Deserialization method that consumes anything and returns an empty value.
/// Intended to be used for a wildcard enum option.
///
/// Example:
/// ```rs
/// #[derive(Deserialize)]
/// enum Fruit {
/// Apple {
/// red: bool,
/// },
/// Banana {
/// yellow: bool,
/// },
/// #[serde(other, deserialize_with = "deserialize_blackhole")]
/// None,
/// }
/// ```
pub fn ignore_any<'de, D>(deserializer: D) -> Result<(), D::Error>
where
D: Deserializer<'de>,
{
deserializer.deserialize_ignored_any(IgnoredAny).and(Ok(()))
}
#[cfg(test)] #[cfg(test)]
mod tests { mod tests {
use serde::Deserialize; use serde::Deserialize;
use serde_with::rust::deserialize_ignore_any;
use super::*; use super::*;
@ -81,7 +56,7 @@ mod tests {
Banana { Banana {
yellow: bool, yellow: bool,
}, },
#[serde(other, deserialize_with = "ignore_any")] #[serde(other, deserialize_with = "deserialize_ignore_any")]
None, None,
} }