first successful download
This commit is contained in:
parent
a6041a013b
commit
beb1177a11
16 changed files with 4076 additions and 121 deletions
|
|
@ -1,2 +1,3 @@
|
|||
pub mod range;
|
||||
pub mod text;
|
||||
// pub mod renderer;
|
||||
|
|
|
|||
|
|
@ -1,5 +1,5 @@
|
|||
use serde::{Deserialize, Deserializer, Serialize, Serializer};
|
||||
use serde_with::{DeserializeAs, json::JsonString, serde_as, SerializeAs};
|
||||
use serde_with::{json::JsonString, serde_as, DeserializeAs, SerializeAs};
|
||||
|
||||
#[serde_as]
|
||||
#[derive(Deserialize, Serialize)]
|
||||
|
|
@ -12,16 +12,25 @@ pub struct Range {
|
|||
|
||||
impl<'de> DeserializeAs<'de, std::ops::Range<u32>> for Range {
|
||||
fn deserialize_as<D>(deserializer: D) -> Result<std::ops::Range<u32>, D::Error>
|
||||
where
|
||||
D: Deserializer<'de> {
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
let range = Range::deserialize(deserializer)?;
|
||||
Ok(std::ops::Range { start: range.start, end: range.end })
|
||||
Ok(std::ops::Range {
|
||||
start: range.start,
|
||||
end: range.end,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
impl SerializeAs<std::ops::Range<u32>> for Range {
|
||||
fn serialize_as<S>(&std::ops::Range { start, end }: &std::ops::Range<u32>, serializer: S) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error> where
|
||||
S: Serializer {
|
||||
fn serialize_as<S>(
|
||||
&std::ops::Range { start, end }: &std::ops::Range<u32>,
|
||||
serializer: S,
|
||||
) -> Result<<S as Serializer>::Ok, <S as Serializer>::Error>
|
||||
where
|
||||
S: Serializer,
|
||||
{
|
||||
Range { start, end }.serialize(serializer)
|
||||
}
|
||||
}
|
||||
|
|
|
|||
98
src/serializer/renderer.rs
Normal file
98
src/serializer/renderer.rs
Normal file
|
|
@ -0,0 +1,98 @@
|
|||
use std::marker::PhantomData;
|
||||
|
||||
use serde::{de::Visitor, Deserialize, Deserializer};
|
||||
use serde_with::{serde_as, DeserializeAs, rust::maps_duplicate_key_is_error::deserialize};
|
||||
|
||||
/// ```json
|
||||
/// {
|
||||
/// itemSectionRenderer": {
|
||||
/// "contents": [
|
||||
/// {
|
||||
/// "playlistVideoListRenderer": {
|
||||
/// "contents": [
|
||||
/// {
|
||||
/// "playlistVideoRenderer": { ... }
|
||||
/// },
|
||||
/// {
|
||||
/// "playlistVideoRenderer": { ... }
|
||||
/// },
|
||||
/// }
|
||||
/// }
|
||||
/// }
|
||||
/// ]
|
||||
/// }
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// Renderer names:
|
||||
///
|
||||
/// 1 content element:
|
||||
/// - tabRenderer > content
|
||||
///
|
||||
/// 1 content element (array):
|
||||
/// - twoColumnBrowseResultsRenderer > tabs
|
||||
/// - sectionListRenderer > contents
|
||||
/// - itemSectionRenderer > contents
|
||||
///
|
||||
/// n content elements:
|
||||
/// - playlistVideoListRenderer > contents
|
||||
|
||||
#[serde_as]
|
||||
#[derive(Deserialize)]
|
||||
#[serde(untagged, bound = "for<'de2> T: Deserialize<'de2>")]
|
||||
pub enum Renderer<T> where for<'de2> T: Deserialize<'de2> {
|
||||
Single {
|
||||
#[serde_as(as = "crate::serializer::renderer::Renderer<T>")]
|
||||
content: T,
|
||||
},
|
||||
Multiple {
|
||||
#[serde(alias = "tabs")]
|
||||
#[serde_as(as = "crate::serializer::renderer::Renderer<T>")]
|
||||
contents: Vec<T>,
|
||||
},
|
||||
Content {
|
||||
#[serde(flatten)]
|
||||
inner: T,
|
||||
},
|
||||
}
|
||||
|
||||
// pub struct Renderer<T>(PhantomData<T>);
|
||||
|
||||
impl<'de, T> DeserializeAs<'de, T> for Renderer<T> {
|
||||
fn deserialize_as<D>(deserializer: D) -> Result<T, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
impl<'de, T> DeserializeAs<'de, Vec<T>> for Renderer<T> {
|
||||
fn deserialize_as<D>(deserializer: D) -> Result<Vec<T>, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
todo!()
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
struct RendererVisitor<T, U>(PhantomData<T>, PhantomData<U>);
|
||||
|
||||
impl<'de, T, U> Visitor<'de> for RendererVisitor<T, U>
|
||||
where
|
||||
U: DeserializeAs<'de, T>,
|
||||
{
|
||||
type Value = T;
|
||||
|
||||
fn expecting(&self, formatter: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||
formatter.write_str("a yt renderer")
|
||||
}
|
||||
|
||||
fn visit_newtype_struct<D>(self, deserializer: D) -> Result<Self::Value, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>, {
|
||||
|
||||
}
|
||||
}
|
||||
*/
|
||||
Reference in a new issue