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