Skip to content

Commit 0150a17

Browse files
committed
direct deserializer hint
1 parent 24eb31f commit 0150a17

File tree

3 files changed

+36
-24
lines changed

3 files changed

+36
-24
lines changed

jomini_derive/src/lib.rs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,16 @@ pub fn derive(input: TokenStream) -> TokenStream {
407407
}
408408
});
409409

410+
let deser_request = if named_fields.named.iter().find_map(binary_token).is_some() {
411+
quote! {
412+
::serde::Deserializer::deserialize_u16(__deserializer, __FieldVisitor)
413+
}
414+
} else {
415+
quote! {
416+
::serde::Deserializer::deserialize_identifier(__deserializer, __FieldVisitor)
417+
}
418+
};
419+
410420
let expecting = format!("struct {}", struct_ident);
411421
let struct_ident_str = struct_ident.to_string();
412422

@@ -475,7 +485,7 @@ pub fn derive(input: TokenStream) -> TokenStream {
475485
where
476486
__D: ::serde::Deserializer<'de>,
477487
{
478-
::serde::Deserializer::deserialize_identifier(__deserializer, __FieldVisitor)
488+
#deser_request
479489
}
480490
}
481491

src/binary/de.rs

Lines changed: 25 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,6 @@ where
423423
s => match self.de.config.resolver.resolve(s) {
424424
Some(id) => visitor.visit_borrowed_str(id),
425425
None => match self.de.config.failed_resolve_strategy {
426-
FailedResolveStrategy::Visit => visitor.visit_u16(s),
427426
FailedResolveStrategy::Error => Err(Error::from(DeserializeError {
428427
kind: DeserializeErrorKind::UnknownToken { token_id: s },
429428
})),
@@ -457,7 +456,6 @@ impl<'a, 'de: 'a, 'res: 'de, RES: TokenResolver, F: BinaryFlavor> de::Deserializ
457456
deserialize_scalar!(deserialize_i8);
458457
deserialize_scalar!(deserialize_i16);
459458
deserialize_scalar!(deserialize_u8);
460-
deserialize_scalar!(deserialize_u16);
461459
deserialize_scalar!(deserialize_char);
462460
deserialize_scalar!(deserialize_identifier);
463461
deserialize_scalar!(deserialize_bytes);
@@ -474,6 +472,17 @@ impl<'a, 'de: 'a, 'res: 'de, RES: TokenResolver, F: BinaryFlavor> de::Deserializ
474472
}
475473
}
476474

475+
fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
476+
where
477+
V: Visitor<'de>,
478+
{
479+
match self.token {
480+
QUOTED_STRING | UNQUOTED_STRING | U32 | I32 | U64 | I64 | BOOL | F32 | F64 | OPEN
481+
| END | EQUAL => self.deser(visitor),
482+
x => visitor.visit_u16(x),
483+
}
484+
}
485+
477486
fn deserialize_i32<V>(self, visitor: V) -> Result<V::Value, Self::Error>
478487
where
479488
V: Visitor<'de>,
@@ -1143,7 +1152,6 @@ fn visit_key<'b, 'de: 'b, 'res: 'de, RES: TokenResolver, F: BinaryFlavor, V: Vis
11431152
BinaryToken::Token(s) => match config.resolver.resolve(s) {
11441153
Some(id) => visitor.visit_borrowed_str(id),
11451154
None => match config.failed_resolve_strategy {
1146-
FailedResolveStrategy::Visit => visitor.visit_u16(s),
11471155
FailedResolveStrategy::Error => Err(Error::from(DeserializeError {
11481156
kind: DeserializeErrorKind::UnknownToken { token_id: s },
11491157
})),
@@ -1161,6 +1169,17 @@ impl<'b, 'de, 'res: 'de, RES: TokenResolver, E: BinaryFlavor> de::Deserializer<'
11611169
{
11621170
type Error = Error;
11631171

1172+
fn deserialize_u16<V>(self, visitor: V) -> Result<V::Value, Self::Error>
1173+
where
1174+
V: Visitor<'de>,
1175+
{
1176+
if let BinaryToken::Token(x) = self.tokens[self.tape_idx] {
1177+
visitor.visit_u16(x)
1178+
} else {
1179+
visit_key(self.tape_idx, self.tokens, self.config, visitor)
1180+
}
1181+
}
1182+
11641183
fn deserialize_any<V>(self, visitor: V) -> Result<V::Value, Self::Error>
11651184
where
11661185
V: Visitor<'de>,
@@ -1169,7 +1188,7 @@ impl<'b, 'de, 'res: 'de, RES: TokenResolver, E: BinaryFlavor> de::Deserializer<'
11691188
}
11701189

11711190
serde::forward_to_deserialize_any! {
1172-
bool i8 i16 i32 i64 i128 u8 u16 u32 u64 u128 f32 f64 char str string
1191+
bool i8 i16 i32 i64 i128 u8 u32 u64 u128 f32 f64 char str string
11731192
bytes byte_buf option unit unit_struct newtype_struct seq tuple
11741193
tuple_struct map enum ignored_any identifier struct
11751194
}
@@ -1830,23 +1849,9 @@ mod tests {
18301849
}
18311850
}
18321851

1833-
let mut builder = eu4_builder();
1834-
builder.on_failed_resolve(FailedResolveStrategy::Visit);
1835-
let result: MyStruct = builder
1836-
.from_slice(&data[..], &NullResolver)
1837-
.unwrap()
1838-
.deserialize()
1839-
.unwrap();
1840-
1841-
let mut on_builder = OndemandBinaryDeserializerBuilder::with_flavor(Eu4Flavor::new());
1842-
on_builder.on_failed_resolve(FailedResolveStrategy::Visit);
1843-
let ondemand = on_builder
1844-
.deserialize_slice(&data[..], &NullResolver)
1845-
.unwrap();
1846-
1847-
assert_eq!(result, ondemand);
1852+
let actual: MyStruct = from_slice(&data[..], &NullResolver).unwrap();
18481853
assert_eq!(
1849-
result,
1854+
actual,
18501855
MyStruct {
18511856
field1: String::from("ENG"),
18521857
}

src/binary/resolver.rs

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,4 @@ pub enum FailedResolveStrategy {
6363

6464
/// Ignore the token
6565
Ignore,
66-
67-
/// Visit the token
68-
Visit,
6966
}

0 commit comments

Comments
 (0)