Skip to main content

sui_rpc/proto/sui/rpc/v2/
events.rs

1use super::*;
2use crate::field::FieldMaskTree;
3use crate::merge::Merge;
4use crate::proto::TryFromProtoError;
5
6//
7// Event
8//
9
10impl 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
149//
150// TransactionEvents
151//
152
153impl 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}