Skip to content

Commit

Permalink
Minor cleanups and fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
harrisonturton committed Jun 15, 2023
1 parent 393b0d6 commit 7d60f0f
Show file tree
Hide file tree
Showing 3 changed files with 25 additions and 22 deletions.
22 changes: 9 additions & 13 deletions serde/src/private/de.rs
Original file line number Diff line number Diff line change
Expand Up @@ -805,18 +805,18 @@ mod content {
/// Not public API.
pub struct TaggedContentVisitor<'de, T> {
tag_name: &'static str,
tag_default: Option<T>,
default_variant: Option<T>,
expecting: &'static str,
value: PhantomData<TaggedContent<'de, T>>,
}

impl<'de, T> TaggedContentVisitor<'de, T> {
/// Visitor for the content of an internally tagged enum with the given
/// tag name.
pub fn new(name: &'static str, default_tag: Option<T>, expecting: &'static str) -> Self {
pub fn new(name: &'static str, default_variant: Option<T>, expecting: &'static str) -> Self {
TaggedContentVisitor {
tag_name: name,
tag_default: default_tag,
default_variant: default_variant,
expecting: expecting,
value: PhantomData,
}
Expand Down Expand Up @@ -853,16 +853,12 @@ mod content {
where
S: SeqAccess<'de>,
{
let tag = match try!(seq.next_element()) {
Some(tag) => {
tag
let tag = match seq.next_element()? {
Some(tag) => tag,
None => match self.default_variant {
Some(variant) => variant,
None => return Err(de::Error::missing_field(self.tag_name)),
},
None => {
match self.tag_default {
Some(default) => default,
None => return Err(de::Error::missing_field(self.tag_name)),
}
}
};
let rest = de::value::SeqAccessDeserializer::new(seq);
Ok(TaggedContent {
Expand Down Expand Up @@ -892,7 +888,7 @@ mod content {
}
}
match tag {
None => match self.tag_default {
None => match self.default_variant {
Some(default) => {
Ok(TaggedContent {
tag: default,
Expand Down
24 changes: 16 additions & 8 deletions serde_derive/src/de.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1344,14 +1344,6 @@ fn deserialize_internally_tagged_enum(
) -> Fragment {
let (variants_stmt, variant_visitor) = prepare_enum_variant_enum(variants, cattrs);

let mut default_variant = quote! { None };
for (i, variant) in variants.iter().enumerate() {
if variant.attrs.default() {
let variant_name = field_i(i);
default_variant = quote!{ Some(__Field::#variant_name) };
}
}

// Match arms to extract a variant from a string
let variant_arms = variants
.iter()
Expand All @@ -1374,6 +1366,10 @@ fn deserialize_internally_tagged_enum(
}
});

let default_variant = get_default_variant(variants).unwrap_or(quote! {
std::option::Option::None
});

let expecting = format!("internally tagged enum {}", params.type_name());
let expecting = cattrs.expecting().unwrap_or(&expecting);

Expand All @@ -1392,6 +1388,18 @@ fn deserialize_internally_tagged_enum(
}
}

fn get_default_variant(variants: &[Variant]) -> Option<TokenStream> {
for (i, variant) in variants.iter().enumerate() {
if variant.attrs.default() {
let variant_name = field_i(i);
return Some(quote! {
std::option::Option::Some(__Field::#variant_name)
});
}
}
None
}

fn deserialize_adjacently_tagged_enum(
params: &Parameters,
variants: &[Variant],
Expand Down
1 change: 0 additions & 1 deletion serde_derive/src/internals/ast.rs
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,6 @@ fn enum_from_ast<'a>(
})
.collect();

// Check only one enum arm is marked #[serde(default)]
let mut has_default = false;
for variant in &variants {
if !variant.attrs.default() {
Expand Down

0 comments on commit 7d60f0f

Please sign in to comment.