serde_automerge/
lib.rs

1#![doc = include_str!("../README.md")]
2
3pub mod de;
4pub mod ser;
5
6pub use automerge::*;
7pub use de::Deserializer;
8pub use ser::Serializer;
9
10#[derive(Debug, thiserror::Error)]
11pub enum AutomergeSerdeError {
12    #[error(transparent)]
13    Serialize(#[from] ser::Error),
14    #[error(transparent)]
15    Deserialize(#[from] de::Error),
16    #[error(transparent)]
17    Automerge(#[from] AutomergeError),
18}
19
20pub trait AutomergeSetExtension {
21    fn set_value<S: serde::Serialize, P: Into<Prop>>(
22        &mut self,
23        obj: ObjId,
24        prop: P,
25        value: S,
26    ) -> Result<ObjId, AutomergeSerdeError>;
27}
28pub trait AutomergeGetExtension {
29    fn get_value<'de, S: serde::Deserialize<'de>, P: Into<Prop>>(
30        &self,
31        obj: ObjId,
32        prop: P,
33    ) -> Result<Option<S>, AutomergeSerdeError>;
34}
35
36impl<'a> AutomergeSetExtension for transaction::Transaction<'a> {
37    fn set_value<S: serde::Serialize, P: Into<Prop>>(
38        &mut self,
39        obj: ObjId,
40        prop: P,
41        value: S,
42    ) -> Result<ObjId, AutomergeSerdeError> {
43        value
44            .serialize(Serializer::new(self, obj, prop))
45            .map(|(_, id)| id)
46            .map_err(Into::into)
47    }
48}
49
50impl AutomergeSetExtension for AutoCommit {
51    fn set_value<S: serde::Serialize, P: Into<Prop>>(
52        &mut self,
53        obj: ObjId,
54        prop: P,
55        value: S,
56    ) -> Result<ObjId, AutomergeSerdeError> {
57        value
58            .serialize(Serializer::new(self, obj, prop))
59            .map(|(_, id)| id)
60            .map_err(Into::into)
61    }
62}
63
64impl AutomergeSetExtension for Automerge {
65    fn set_value<S: serde::Serialize, P: Into<Prop>>(
66        &mut self,
67        obj: ObjId,
68        prop: P,
69        value: S,
70    ) -> Result<ObjId, AutomergeSerdeError> {
71        let mut transaction = self.transaction();
72        let id = transaction.set_value(obj, prop, value)?;
73        transaction.commit();
74        Ok(id)
75    }
76}
77
78impl AutomergeGetExtension for Automerge {
79    fn get_value<'de, S: serde::Deserialize<'de>, P: Into<Prop>>(
80        &self,
81        obj: ObjId,
82        prop: P,
83    ) -> Result<Option<S>, AutomergeSerdeError> {
84        self.get(obj, prop)?
85            .map(|(v, id)| Deserializer::new_found(self, v, id))
86            .map(|d| S::deserialize(d))
87            .transpose()
88            .map_err(Into::into)
89    }
90}
91
92pub trait AutomergeExtension: AutomergeSetExtension + AutomergeGetExtension {}
93impl<T: AutomergeSetExtension + AutomergeGetExtension> AutomergeExtension for T {}