Skip to content

Commit 978ab7c

Browse files
committed
nicer serde impls
1 parent eb8d87d commit 978ab7c

File tree

1 file changed

+65
-38
lines changed
  • src/librustdoc/html/render

1 file changed

+65
-38
lines changed

src/librustdoc/html/render/mod.rs

Lines changed: 65 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ use rustc_middle::ty::{self, TyCtxt};
6262
use rustc_span::symbol::{Symbol, sym};
6363
use rustc_span::{BytePos, DUMMY_SP, FileName, RealFileName};
6464
use serde::ser::SerializeSeq as _;
65-
use serde::{Deserialize, Serialize};
65+
use serde::{Deserialize, Deserializer, Serialize, Serializer};
6666
use tracing::{debug, info};
6767

6868
pub(crate) use self::context::*;
@@ -428,69 +428,96 @@ impl IndexItemFunctionType {
428428
impl Serialize for IndexItemFunctionType {
429429
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
430430
where
431-
S: serde::Serializer,
431+
S: Serializer,
432432
{
433-
let mut seq = serializer.serialize_seq(Some(2))?;
434-
let mut fn_type = String::new();
435-
self.write_to_string_without_param_names(&mut fn_type);
436-
seq.serialize_element(&fn_type)?;
437-
438433
struct ParamNames<'a>(&'a [Option<Symbol>]);
439434

440435
impl<'a> Serialize for ParamNames<'a> {
441436
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
442437
where
443-
S: serde::Serializer,
438+
S: Serializer,
444439
{
445440
serializer.collect_seq(
446441
self.0
447442
.iter()
448-
.map(|symbol| symbol.as_ref().map(ToString::to_string).unwrap_or_default()),
443+
.map(|symbol| symbol.as_ref().map(Symbol::as_str).unwrap_or_default()),
449444
)
450445
}
451446
}
452447

448+
let mut seq = serializer.serialize_seq(Some(2))?;
449+
450+
let mut fn_type = String::new();
451+
self.write_to_string_without_param_names(&mut fn_type);
452+
seq.serialize_element(&fn_type)?;
453+
453454
seq.serialize_element(&ParamNames(&self.param_names))?;
455+
454456
seq.end()
455457
}
456458
}
457459

458460
impl<'de> Deserialize<'de> for IndexItemFunctionType {
459461
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
460462
where
461-
D: serde::Deserializer<'de>,
463+
D: Deserializer<'de>,
462464
{
463-
use serde::de::{self, Error as _};
465+
use serde::de::{self, SeqAccess};
464466

465-
struct FunctionDataVisitor;
466-
impl<'de> de::Visitor<'de> for FunctionDataVisitor {
467-
type Value = IndexItemFunctionType;
468-
fn expecting(&self, formatter: &mut std::fmt::Formatter<'_>) -> fmt::Result {
469-
write!(formatter, "fn data")
470-
}
471-
fn visit_seq<A: de::SeqAccess<'de>>(self, mut v: A) -> Result<Self::Value, A::Error> {
472-
let (mut function_signature, _) = v
473-
.next_element()?
474-
.map(|fn_: String| {
475-
IndexItemFunctionType::read_from_string_without_param_names(fn_.as_bytes())
476-
})
477-
.ok_or_else(|| A::Error::missing_field("function_signature"))?;
478-
let param_names: Vec<Option<Symbol>> = v
479-
.next_element()?
480-
.map(|param_names: Vec<String>| {
481-
param_names
482-
.into_iter()
483-
.map(|symbol| {
484-
if symbol.is_empty() { None } else { Some(Symbol::intern(&symbol)) }
485-
})
486-
.collect()
487-
})
488-
.ok_or_else(|| A::Error::missing_field("param_names"))?;
489-
function_signature.param_names = param_names;
490-
Ok(function_signature)
467+
#[derive(Deserialize)]
468+
struct Deserialized {
469+
#[serde(deserialize_with = "function_signature")]
470+
function_signature: IndexItemFunctionType,
471+
#[serde(deserialize_with = "param_names")]
472+
param_names: Vec<Option<Symbol>>,
473+
}
474+
475+
fn function_signature<'de, D: Deserializer<'de>>(
476+
deserializer: D,
477+
) -> Result<IndexItemFunctionType, D::Error> {
478+
String::deserialize(deserializer).map(|sig| {
479+
IndexItemFunctionType::read_from_string_without_param_names(sig.as_bytes()).0
480+
})
481+
}
482+
483+
fn param_names<'de, D: Deserializer<'de>>(
484+
deserializer: D,
485+
) -> Result<Vec<Option<Symbol>>, D::Error> {
486+
struct Visitor;
487+
488+
impl<'de> de::Visitor<'de> for Visitor {
489+
type Value = Vec<Option<Symbol>>;
490+
491+
fn expecting(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
492+
f.write_str("seq of param names")
493+
}
494+
495+
fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
496+
where
497+
A: SeqAccess<'de>,
498+
{
499+
let mut param_names = Vec::with_capacity(seq.size_hint().unwrap_or_default());
500+
501+
while let Some(symbol) = seq.next_element::<String>()? {
502+
param_names.push(if symbol.is_empty() {
503+
None
504+
} else {
505+
Some(Symbol::intern(&symbol))
506+
});
507+
}
508+
509+
Ok(param_names)
510+
}
491511
}
512+
513+
deserializer.deserialize_seq(Visitor)
492514
}
493-
deserializer.deserialize_any(FunctionDataVisitor)
515+
516+
let Deserialized { mut function_signature, param_names } =
517+
Deserialized::deserialize(deserializer)?;
518+
function_signature.param_names = param_names;
519+
520+
Ok(function_signature)
494521
}
495522
}
496523

0 commit comments

Comments
 (0)