Skip to content
This repository was archived by the owner on Dec 17, 2024. It is now read-only.

Commit a6a7116

Browse files
committed
Add support for more tokens served as enum variant identifiers
This includes borrowed and owned variants of strings / bytes and all supported unsigned integers
1 parent adaa232 commit a6a7116

File tree

1 file changed

+67
-1
lines changed

1 file changed

+67
-1
lines changed

src/de.rs

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
use crate::error::Error;
22
use crate::token::Token;
3-
use serde::de::value::{MapAccessDeserializer, SeqAccessDeserializer};
3+
use serde::de::value::{
4+
BorrowedBytesDeserializer, BorrowedStrDeserializer, MapAccessDeserializer,
5+
SeqAccessDeserializer,
6+
};
47
use serde::de::{
58
self, Deserialize, DeserializeSeed, EnumAccess, IntoDeserializer, MapAccess, SeqAccess,
69
VariantAccess, Visitor,
@@ -598,10 +601,28 @@ impl<'de, 'a> MapAccess<'de> for EnumMapVisitor<'a, 'de> {
598601
{
599602
match self.variant.take() {
600603
Some(Token::Str(variant)) => seed.deserialize(variant.into_deserializer()).map(Some),
604+
Some(Token::BorrowedStr(variant)) => seed
605+
.deserialize(BorrowedStrDeserializer::new(variant))
606+
.map(Some),
607+
Some(Token::String(variant)) => seed
608+
.deserialize(StringDeserializer { value: variant })
609+
.map(Some),
610+
601611
Some(Token::Bytes(variant)) => seed
612+
.deserialize(BorrowedBytesDeserializer::new(variant))
613+
.map(Some),
614+
Some(Token::BorrowedBytes(variant)) => seed
602615
.deserialize(BytesDeserializer { value: variant })
603616
.map(Some),
617+
Some(Token::ByteBuf(variant)) => seed
618+
.deserialize(ByteBufDeserializer { value: variant })
619+
.map(Some),
620+
621+
Some(Token::U8(variant)) => seed.deserialize(variant.into_deserializer()).map(Some),
622+
Some(Token::U16(variant)) => seed.deserialize(variant.into_deserializer()).map(Some),
604623
Some(Token::U32(variant)) => seed.deserialize(variant.into_deserializer()).map(Some),
624+
Some(Token::U64(variant)) => seed.deserialize(variant.into_deserializer()).map(Some),
625+
605626
Some(other) => Err(unexpected(other)),
606627
None => Ok(None),
607628
}
@@ -641,6 +662,7 @@ impl<'de, 'a> MapAccess<'de> for EnumMapVisitor<'a, 'de> {
641662
}
642663
}
643664

665+
/// `BytesDeserializer` in serde available only since v1.0.121
644666
struct BytesDeserializer {
645667
value: &'static [u8],
646668
}
@@ -661,3 +683,47 @@ impl<'de> de::Deserializer<'de> for BytesDeserializer {
661683
tuple_struct map struct enum identifier ignored_any
662684
}
663685
}
686+
687+
/// `StringDeserializer` in serde available only since v1.0.139 and makes unwanted
688+
/// conversions in `visit_enum`
689+
struct StringDeserializer {
690+
value: &'static str,
691+
}
692+
693+
impl<'de> de::Deserializer<'de> for StringDeserializer {
694+
type Error = Error;
695+
696+
fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
697+
where
698+
V: de::Visitor<'de>,
699+
{
700+
visitor.visit_string(self.value.to_string())
701+
}
702+
703+
forward_to_deserialize_any! {
704+
bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
705+
bytes byte_buf option unit unit_struct newtype_struct seq tuple
706+
tuple_struct map struct enum identifier ignored_any
707+
}
708+
}
709+
710+
struct ByteBufDeserializer {
711+
value: &'static [u8],
712+
}
713+
714+
impl<'de> de::Deserializer<'de> for ByteBufDeserializer {
715+
type Error = Error;
716+
717+
fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
718+
where
719+
V: de::Visitor<'de>,
720+
{
721+
visitor.visit_byte_buf(self.value.to_vec())
722+
}
723+
724+
forward_to_deserialize_any! {
725+
bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
726+
bytes byte_buf option unit unit_struct newtype_struct seq tuple
727+
tuple_struct map struct enum identifier ignored_any
728+
}
729+
}

0 commit comments

Comments
 (0)