refactor: use serde_with::rust::deserialize_ignore_any
This commit is contained in:
parent
9501e95505
commit
f7b7c1954c
7 changed files with 23 additions and 50 deletions
|
|
@ -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,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Reference in a new issue