automerge/automerge

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