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

View file

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

View file

@ -1,7 +1,7 @@
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};
@ -28,7 +28,7 @@ pub(crate) enum ItemSection {
#[serde_as(as = "VecSkipError<_>")]
contents: Vec<ShowingResultsFor>,
},
#[serde(other, deserialize_with = "ignore_any")]
#[serde(other, deserialize_with = "deserialize_ignore_any")]
None,
}

View file

@ -1,8 +1,10 @@
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::{ignore_any, MapResult, VecLogError};
use crate::serializer::{MapResult, VecLogError};
use crate::util::MappingError;
use super::{
@ -156,7 +158,7 @@ pub(crate) enum PlaylistItem {
continuation_endpoint: ContinuationEndpoint,
},
/// No video list item (e.g. ad) or unimplemented item
#[serde(other, deserialize_with = "ignore_any")]
#[serde(other, deserialize_with = "deserialize_ignore_any")]
None,
}

View file

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

View file

@ -1,7 +1,9 @@
use fancy_regex::Regex;
use once_cell::sync::Lazy;
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 super::{ChannelBadge, ContinuationEndpoint, Thumbnails};
@ -9,7 +11,6 @@ use crate::{
model::{Channel, ChannelId, ChannelItem, ChannelTag, PlaylistItem, VideoItem, YouTubeItem},
param::Language,
serializer::{
ignore_any,
text::{AccessibilityText, Text, TextComponent},
MapResult, VecLogError,
},
@ -69,7 +70,7 @@ pub(crate) enum YouTubeListItem {
/// Unimplemented:
/// - compactPlaylistRenderer (recommended playlists)
/// - compactRadioRenderer (recommended mix)
#[serde(other, deserialize_with = "ignore_any")]
#[serde(other, deserialize_with = "deserialize_ignore_any")]
None,
}

View file

@ -10,8 +10,6 @@ pub use vec_log_err::VecLogError;
use std::fmt::Debug;
use serde::{de::IgnoredAny, Deserializer};
/// This represents a result from a deserializing/mapping operation.
/// It holds the desired content (`c`) and a list of warning messages,
/// 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)]
mod tests {
use serde::Deserialize;
use serde_with::rust::deserialize_ignore_any;
use super::*;
@ -81,7 +56,7 @@ mod tests {
Banana {
yellow: bool,
},
#[serde(other, deserialize_with = "ignore_any")]
#[serde(other, deserialize_with = "deserialize_ignore_any")]
None,
}