Fix ambiguous key deserialization ()

This commit is contained in:
Andrew Jeffery 2021-06-28 18:09:18 +01:00 committed by GitHub
parent 3db6f9ef13
commit 78dc394a7a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 14 additions and 23 deletions
automerge-protocol/src/serde_impls

View file

@ -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))
}
}
}

View file

@ -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;

View file

@ -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)?,