sui_rpc/proto/sui/rpc/v2/
events.rs1use super::*;
2use crate::field::FieldMaskTree;
3use crate::merge::Merge;
4use crate::proto::TryFromProtoError;
5
6impl From<sui_sdk_types::Event> for Event {
11 fn from(value: sui_sdk_types::Event) -> Self {
12 Self::merge_from(value, &FieldMaskTree::new_wildcard())
13 }
14}
15
16impl Merge<sui_sdk_types::Event> for Event {
17 fn merge(&mut self, source: sui_sdk_types::Event, mask: &FieldMaskTree) {
18 if mask.contains(Self::PACKAGE_ID_FIELD.name) {
19 self.package_id = Some(source.package_id.to_string());
20 }
21
22 if mask.contains(Self::MODULE_FIELD.name) {
23 self.module = Some(source.module.to_string());
24 }
25
26 if mask.contains(Self::SENDER_FIELD.name) {
27 self.sender = Some(source.sender.to_string());
28 }
29
30 if mask.contains(Self::EVENT_TYPE_FIELD.name) {
31 self.event_type = Some(source.type_.to_string());
32 }
33
34 if mask.contains(Self::CONTENTS_FIELD.name) {
35 self.contents = Some(Bcs {
36 name: Some(source.type_.to_string()),
37 value: Some(source.contents.into()),
38 });
39 }
40 }
41}
42
43impl Merge<&Event> for Event {
44 fn merge(&mut self, source: &Event, mask: &FieldMaskTree) {
45 let Event {
46 package_id,
47 module,
48 sender,
49 event_type,
50 contents,
51 json,
52 checkpoint,
53 transaction_digest,
54 transaction_index,
55 event_index,
56 } = source;
57
58 if mask.contains(Self::PACKAGE_ID_FIELD.name) {
59 self.package_id = package_id.clone();
60 }
61
62 if mask.contains(Self::MODULE_FIELD.name) {
63 self.module = module.clone();
64 }
65
66 if mask.contains(Self::SENDER_FIELD.name) {
67 self.sender = sender.clone();
68 }
69
70 if mask.contains(Self::EVENT_TYPE_FIELD.name) {
71 self.event_type = event_type.clone();
72 }
73
74 if mask.contains(Self::CONTENTS_FIELD.name) {
75 self.contents = contents.clone();
76 }
77
78 if mask.contains(Self::JSON_FIELD.name) {
79 self.json = json.clone();
80 }
81
82 if mask.contains(Self::CHECKPOINT_FIELD.name) {
83 self.checkpoint = *checkpoint;
84 }
85
86 if mask.contains(Self::TRANSACTION_DIGEST_FIELD.name) {
87 self.transaction_digest = transaction_digest.clone();
88 }
89
90 if mask.contains(Self::TRANSACTION_INDEX_FIELD.name) {
91 self.transaction_index = *transaction_index;
92 }
93
94 if mask.contains(Self::EVENT_INDEX_FIELD.name) {
95 self.event_index = *event_index;
96 }
97 }
98}
99
100impl TryFrom<&Event> for sui_sdk_types::Event {
101 type Error = TryFromProtoError;
102
103 fn try_from(value: &Event) -> Result<Self, Self::Error> {
104 let package_id = value
105 .package_id
106 .as_ref()
107 .ok_or_else(|| TryFromProtoError::missing("package_id"))?
108 .parse()
109 .map_err(|e| TryFromProtoError::invalid(Event::PACKAGE_ID_FIELD, e))?;
110
111 let module = value
112 .module
113 .as_ref()
114 .ok_or_else(|| TryFromProtoError::missing("module"))?
115 .parse()
116 .map_err(|e| TryFromProtoError::invalid(Event::MODULE_FIELD, e))?;
117
118 let sender = value
119 .sender
120 .as_ref()
121 .ok_or_else(|| TryFromProtoError::missing("sender"))?
122 .parse()
123 .map_err(|e| TryFromProtoError::invalid(Event::SENDER_FIELD, e))?;
124
125 let type_ = value
126 .event_type
127 .as_ref()
128 .ok_or_else(|| TryFromProtoError::missing("event_type"))?
129 .parse()
130 .map_err(|e| TryFromProtoError::invalid(Event::EVENT_TYPE_FIELD, e))?;
131
132 let contents = value
133 .contents
134 .as_ref()
135 .ok_or_else(|| TryFromProtoError::missing("contents"))?
136 .value()
137 .to_vec();
138
139 Ok(Self {
140 package_id,
141 module,
142 sender,
143 type_,
144 contents,
145 })
146 }
147}
148
149impl From<sui_sdk_types::TransactionEvents> for TransactionEvents {
154 fn from(value: sui_sdk_types::TransactionEvents) -> Self {
155 Self::merge_from(value, &FieldMaskTree::new_wildcard())
156 }
157}
158
159impl Merge<sui_sdk_types::TransactionEvents> for TransactionEvents {
160 fn merge(&mut self, source: sui_sdk_types::TransactionEvents, mask: &FieldMaskTree) {
161 if mask.contains(Self::BCS_FIELD.name) {
162 let mut bcs = super::Bcs::serialize(&source).unwrap();
163 bcs.name = Some("TransactionEvents".to_owned());
164 self.bcs = Some(bcs);
165 }
166
167 if mask.contains(Self::DIGEST_FIELD.name) {
168 self.digest = Some(source.digest().to_string());
169 }
170
171 if let Some(events_mask) = mask.subtree(Self::EVENTS_FIELD.name) {
172 self.events = source
173 .0
174 .into_iter()
175 .map(|event| Event::merge_from(event, &events_mask))
176 .collect();
177 }
178 }
179}
180
181impl Merge<&TransactionEvents> for TransactionEvents {
182 fn merge(&mut self, source: &TransactionEvents, mask: &FieldMaskTree) {
183 let TransactionEvents {
184 bcs,
185 digest,
186 events,
187 } = source;
188
189 if mask.contains(Self::BCS_FIELD.name) {
190 self.bcs = bcs.clone();
191 }
192
193 if mask.contains(Self::DIGEST_FIELD.name) {
194 self.digest = digest.clone();
195 }
196
197 if let Some(events_mask) = mask.subtree(Self::EVENTS_FIELD.name) {
198 self.events = events
199 .iter()
200 .map(|event| Event::merge_from(event, &events_mask))
201 .collect();
202 }
203 }
204}
205
206impl TryFrom<&TransactionEvents> for sui_sdk_types::TransactionEvents {
207 type Error = TryFromProtoError;
208
209 fn try_from(value: &TransactionEvents) -> Result<Self, Self::Error> {
210 Ok(Self(
211 value
212 .events
213 .iter()
214 .map(TryInto::try_into)
215 .collect::<Result<_, _>>()?,
216 ))
217 }
218}