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        } = source;
53
54        if mask.contains(Self::PACKAGE_ID_FIELD.name) {
55            self.package_id = package_id.clone();
56        }
57
58        if mask.contains(Self::MODULE_FIELD.name) {
59            self.module = module.clone();
60        }
61
62        if mask.contains(Self::SENDER_FIELD.name) {
63            self.sender = sender.clone();
64        }
65
66        if mask.contains(Self::EVENT_TYPE_FIELD.name) {
67            self.event_type = event_type.clone();
68        }
69
70        if mask.contains(Self::CONTENTS_FIELD.name) {
71            self.contents = contents.clone();
72        }
73
74        if mask.contains(Self::JSON_FIELD.name) {
75            self.json = json.clone();
76        }
77    }
78}
79
80impl TryFrom<&Event> for sui_sdk_types::Event {
81    type Error = TryFromProtoError;
82
83    fn try_from(value: &Event) -> Result<Self, Self::Error> {
84        let package_id = value
85            .package_id
86            .as_ref()
87            .ok_or_else(|| TryFromProtoError::missing("package_id"))?
88            .parse()
89            .map_err(|e| TryFromProtoError::invalid(Event::PACKAGE_ID_FIELD, e))?;
90
91        let module = value
92            .module
93            .as_ref()
94            .ok_or_else(|| TryFromProtoError::missing("module"))?
95            .parse()
96            .map_err(|e| TryFromProtoError::invalid(Event::MODULE_FIELD, e))?;
97
98        let sender = value
99            .sender
100            .as_ref()
101            .ok_or_else(|| TryFromProtoError::missing("sender"))?
102            .parse()
103            .map_err(|e| TryFromProtoError::invalid(Event::SENDER_FIELD, e))?;
104
105        let type_ = value
106            .event_type
107            .as_ref()
108            .ok_or_else(|| TryFromProtoError::missing("event_type"))?
109            .parse()
110            .map_err(|e| TryFromProtoError::invalid(Event::EVENT_TYPE_FIELD, e))?;
111
112        let contents = value
113            .contents
114            .as_ref()
115            .ok_or_else(|| TryFromProtoError::missing("contents"))?
116            .value()
117            .to_vec();
118
119        Ok(Self {
120            package_id,
121            module,
122            sender,
123            type_,
124            contents,
125        })
126    }
127}
128
129//
130// TransactionEvents
131//
132
133impl From<sui_sdk_types::TransactionEvents> for TransactionEvents {
134    fn from(value: sui_sdk_types::TransactionEvents) -> Self {
135        Self::merge_from(value, &FieldMaskTree::new_wildcard())
136    }
137}
138
139impl Merge<sui_sdk_types::TransactionEvents> for TransactionEvents {
140    fn merge(&mut self, source: sui_sdk_types::TransactionEvents, mask: &FieldMaskTree) {
141        if mask.contains(Self::BCS_FIELD.name) {
142            let mut bcs = super::Bcs::serialize(&source).unwrap();
143            bcs.name = Some("TransactionEvents".to_owned());
144            self.bcs = Some(bcs);
145        }
146
147        if mask.contains(Self::DIGEST_FIELD.name) {
148            self.digest = Some(source.digest().to_string());
149        }
150
151        if let Some(events_mask) = mask.subtree(Self::EVENTS_FIELD.name) {
152            self.events = source
153                .0
154                .into_iter()
155                .map(|event| Event::merge_from(event, &events_mask))
156                .collect();
157        }
158    }
159}
160
161impl Merge<&TransactionEvents> for TransactionEvents {
162    fn merge(&mut self, source: &TransactionEvents, mask: &FieldMaskTree) {
163        let TransactionEvents {
164            bcs,
165            digest,
166            events,
167        } = source;
168
169        if mask.contains(Self::BCS_FIELD.name) {
170            self.bcs = bcs.clone();
171        }
172
173        if mask.contains(Self::DIGEST_FIELD.name) {
174            self.digest = digest.clone();
175        }
176
177        if let Some(events_mask) = mask.subtree(Self::EVENTS_FIELD.name) {
178            self.events = events
179                .iter()
180                .map(|event| Event::merge_from(event, &events_mask))
181                .collect();
182        }
183    }
184}
185
186impl TryFrom<&TransactionEvents> for sui_sdk_types::TransactionEvents {
187    type Error = TryFromProtoError;
188
189    fn try_from(value: &TransactionEvents) -> Result<Self, Self::Error> {
190        Ok(Self(
191            value
192                .events
193                .iter()
194                .map(TryInto::try_into)
195                .collect::<Result<_, _>>()?,
196        ))
197    }
198}