From 9d243fa0ad38ea0aa1f125554850bd926430b87f Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 24 Nov 2023 17:22:35 +0100 Subject: [PATCH 1/2] fix: parsing text components with empty navigation endpoints --- src/serializer/text.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/serializer/text.rs b/src/serializer/text.rs index 90ad772..12101f2 100644 --- a/src/serializer/text.rs +++ b/src/serializer/text.rs @@ -3,7 +3,7 @@ use std::convert::TryFrom; use once_cell::sync::Lazy; use regex::Regex; use serde::{Deserialize, Deserializer}; -use serde_with::{serde_as, DeserializeAs, VecSkipError}; +use serde_with::{serde_as, DefaultOnError, DeserializeAs, VecSkipError}; use crate::{ client::response::url_endpoint::{ @@ -122,10 +122,13 @@ struct RichTextInternal { } /// TextLinkRun is a single component from a YouTube text with links +#[serde_as] #[derive(Deserialize)] #[serde(rename_all = "camelCase")] struct RichTextRun { text: String, + #[serde(default)] + #[serde_as(as = "DefaultOnError")] navigation_endpoint: Option, } From 9a652d851fa962183e60b11cbb4e34477a979aac Mon Sep 17 00:00:00 2001 From: ThetaDev Date: Fri, 24 Nov 2023 17:40:05 +0100 Subject: [PATCH 2/2] fix: improve VecLogErr messages --- src/serializer/vec_log_err.rs | 29 ++++++++++------------------- 1 file changed, 10 insertions(+), 19 deletions(-) diff --git a/src/serializer/vec_log_err.rs b/src/serializer/vec_log_err.rs index 9e3e32c..c2e89ff 100644 --- a/src/serializer/vec_log_err.rs +++ b/src/serializer/vec_log_err.rs @@ -20,13 +20,6 @@ where where D: serde::Deserializer<'de>, { - #[derive(serde::Deserialize)] - #[serde(untagged)] - enum GoodOrError { - Good(T), - Error(serde_json::Value), - } - struct SeqVisitor(PhantomData); impl<'de, T> Visitor<'de> for SeqVisitor @@ -46,16 +39,14 @@ where let mut values = Vec::with_capacity(seq.size_hint().unwrap_or_default()); let mut warnings = Vec::new(); - while let Some(value) = seq.next_element()? { - match value { - GoodOrError::::Good(value) => { - values.push(value); - } - GoodOrError::::Error(value) => { - warnings.push(format!( - "error deserializing item: {}", - serde_json::to_string(&value).unwrap_or_default() - )); + loop { + match seq.next_element::() { + Ok(val) => match val { + Some(val) => values.push(val), + None => break, + }, + Err(e) => { + warnings.push(format!("error deserializing item: {e}")); } } } @@ -186,8 +177,8 @@ mod tests { insta::assert_debug_snapshot!(res.items.warnings, @r###" [ - "error deserializing item: {\"xyz\":\"i2\"}", - "error deserializing item: {\"namra\":\"i4\"}", + "error deserializing item: missing field `name` at line 1 column 40", + "error deserializing item: missing field `name` at line 1 column 73", ] "###); }