Fix ambiguous key deserialization (#197)
This commit is contained in:
parent
3db6f9ef13
commit
78dc394a7a
3 changed files with 14 additions and 23 deletions
|
@ -1,20 +0,0 @@
|
|||
use std::str::FromStr;
|
||||
|
||||
use serde::{Deserialize, Deserializer};
|
||||
use smol_str::SmolStr;
|
||||
|
||||
use crate::{ElementId, Key};
|
||||
|
||||
impl<'de> Deserialize<'de> for Key {
|
||||
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
|
||||
where
|
||||
D: Deserializer<'de>,
|
||||
{
|
||||
let s = SmolStr::deserialize(deserializer)?;
|
||||
if let Ok(eid) = ElementId::from_str(&s) {
|
||||
Ok(Key::Seq(eid))
|
||||
} else {
|
||||
Ok(Key::Map(s))
|
||||
}
|
||||
}
|
||||
}
|
|
@ -8,7 +8,6 @@ mod change_hash;
|
|||
mod cursor_diff;
|
||||
mod diff;
|
||||
mod element_id;
|
||||
mod key;
|
||||
mod multi_element_insert;
|
||||
mod object_id;
|
||||
mod op;
|
||||
|
|
|
@ -158,8 +158,20 @@ impl<'de> Deserialize<'de> for Op {
|
|||
match field.as_ref() {
|
||||
"action" => read_field("action", &mut action, &mut map)?,
|
||||
"obj" => read_field("obj", &mut obj, &mut map)?,
|
||||
"key" => read_field("key", &mut key, &mut map)?,
|
||||
"elemId" => read_field("elemId", &mut key, &mut map)?,
|
||||
"key" => {
|
||||
if key.is_some() {
|
||||
return Err(Error::duplicate_field("key"));
|
||||
} else {
|
||||
key = Some(Key::Map(map.next_value()?));
|
||||
}
|
||||
}
|
||||
"elemId" => {
|
||||
if key.is_some() {
|
||||
return Err(Error::duplicate_field("elemId"));
|
||||
} else {
|
||||
key = Some(Key::Seq(map.next_value()?))
|
||||
}
|
||||
}
|
||||
"pred" => read_field("pred", &mut pred, &mut map)?,
|
||||
"insert" => read_field("insert", &mut insert, &mut map)?,
|
||||
"datatype" => read_field("datatype", &mut datatype, &mut map)?,
|
||||
|
|
Loading…
Add table
Reference in a new issue