rfc: consider uuid support in autoserde
Opened this issue · 0 comments
aran commented
Something like the following is pretty useful for anyone working with UUIDs in docs. Probably would need to be behind a feature.
impl<'a, R: automerge::ReadDoc> serde::Serialize for AutoSerdeVal<'a, R> {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
match &self.val {
Value::Object(ObjType::Map | ObjType::Table) => {
let map = AutoSerdeMap {
doc: self.doc,
obj: self.obj.clone(),
};
map.serialize(serializer)
}
Value::Object(ObjType::Text) => {
let text = self.doc.text(&self.obj).unwrap();
text.serialize(serializer)
}
Value::Object(ObjType::List) => {
let seq = AutoSerdeSeq {
doc: self.doc,
obj: self.obj.clone(),
};
seq.serialize(serializer)
}
Value::Scalar(v) => {
if let Some(b) = v.to_bytes() {
// wrong if there's 16-byte slices that aren't uuids :)
if let Ok(u) = Uuid::from_slice(b) {
u.serialize(serializer)
}
else { v.serialize(serializer) }
} else {
v.serialize(serializer)
}
}
}
}
}