1use std::fmt::Display;
5
6use af_sui_types::{
7 Address as SuiAddress,
8 OBJECT_DIGEST_DELETED,
9 OBJECT_DIGEST_WRAPPED,
10 ObjectDigest,
11 ObjectId,
12 ObjectRef,
13 Owner,
14 StructTag,
15};
16use serde::{Deserialize, Serialize};
17use serde_with::{DisplayFromStr, serde_as};
18use sui_sdk_types::Version;
19
20use crate::serde::BigInt;
21
22#[serde_as]
24#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, Eq)]
25#[serde(rename_all = "camelCase", tag = "type")]
26pub enum ObjectChange {
27 #[serde(rename_all = "camelCase")]
29 Published {
30 package_id: ObjectId,
31 #[serde_as(as = "BigInt<u64>")]
32 version: Version,
33 digest: ObjectDigest,
34 modules: Vec<String>,
35 },
36 #[serde(rename_all = "camelCase")]
38 Transferred {
39 sender: SuiAddress,
40 recipient: Owner,
41 #[serde_as(as = "DisplayFromStr")]
43 object_type: StructTag,
44 object_id: ObjectId,
45 #[serde_as(as = "BigInt<u64>")]
46 version: Version,
47 digest: ObjectDigest,
48 },
49 #[serde(rename_all = "camelCase")]
51 Mutated {
52 sender: SuiAddress,
53 owner: Owner,
54 #[serde_as(as = "DisplayFromStr")]
56 object_type: StructTag,
57 object_id: ObjectId,
58 #[serde_as(as = "BigInt<u64>")]
59 version: Version,
60 #[serde_as(as = "BigInt<u64>")]
61 previous_version: Version,
62 digest: ObjectDigest,
63 },
64 #[serde(rename_all = "camelCase")]
66 Deleted {
67 sender: SuiAddress,
68 #[serde_as(as = "DisplayFromStr")]
70 object_type: StructTag,
71 object_id: ObjectId,
72 #[serde_as(as = "BigInt<u64>")]
73 version: Version,
74 },
75 #[serde(rename_all = "camelCase")]
77 Wrapped {
78 sender: SuiAddress,
79 #[serde_as(as = "DisplayFromStr")]
81 object_type: StructTag,
82 object_id: ObjectId,
83 #[serde_as(as = "BigInt<u64>")]
84 version: Version,
85 },
86 #[serde(rename_all = "camelCase")]
88 Created {
89 sender: SuiAddress,
90 owner: Owner,
91 #[serde_as(as = "DisplayFromStr")]
93 object_type: StructTag,
94 object_id: ObjectId,
95 #[serde_as(as = "BigInt<u64>")]
96 version: Version,
97 digest: ObjectDigest,
98 },
99}
100
101impl ObjectChange {
102 pub fn object_id(&self) -> ObjectId {
103 match self {
104 ObjectChange::Published { package_id, .. } => *package_id,
105 ObjectChange::Transferred { object_id, .. }
106 | ObjectChange::Mutated { object_id, .. }
107 | ObjectChange::Deleted { object_id, .. }
108 | ObjectChange::Wrapped { object_id, .. }
109 | ObjectChange::Created { object_id, .. } => *object_id,
110 }
111 }
112
113 pub fn object_ref(&self) -> ObjectRef {
114 match self {
115 ObjectChange::Published {
116 package_id,
117 version,
118 digest,
119 ..
120 } => (*package_id, *version, *digest),
121 ObjectChange::Transferred {
122 object_id,
123 version,
124 digest,
125 ..
126 }
127 | ObjectChange::Mutated {
128 object_id,
129 version,
130 digest,
131 ..
132 }
133 | ObjectChange::Created {
134 object_id,
135 version,
136 digest,
137 ..
138 } => (*object_id, *version, *digest),
139 ObjectChange::Deleted {
140 object_id, version, ..
141 } => (*object_id, *version, OBJECT_DIGEST_DELETED),
142 ObjectChange::Wrapped {
143 object_id, version, ..
144 } => (*object_id, *version, OBJECT_DIGEST_WRAPPED),
145 }
146 }
147}
148
149impl Display for ObjectChange {
150 fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
151 match self {
152 ObjectChange::Published {
153 package_id,
154 version,
155 digest,
156 modules,
157 } => {
158 write!(
159 f,
160 " ┌──\n │ PackageID: {} \n │ Version: {} \n │ Digest: {}\n │ Modules: {}\n └──",
161 package_id,
162 version,
163 digest,
164 modules.join(", ")
165 )
166 }
167 ObjectChange::Transferred {
168 sender,
169 recipient,
170 object_type,
171 object_id,
172 version,
173 digest,
174 } => {
175 write!(
176 f,
177 " ┌──\n │ ObjectId: {}\n │ Sender: {} \n │ Recipient: {}\n │ ObjectType: {} \n │ Version: {}\n │ Digest: {}\n └──",
178 object_id, sender, recipient, object_type, version, digest
179 )
180 }
181 ObjectChange::Mutated {
182 sender,
183 owner,
184 object_type,
185 object_id,
186 version,
187 previous_version: _,
188 digest,
189 } => {
190 write!(
191 f,
192 " ┌──\n │ ObjectId: {}\n │ Sender: {} \n │ Owner: {}\n │ ObjectType: {} \n │ Version: {}\n │ Digest: {}\n └──",
193 object_id, sender, owner, object_type, version, digest
194 )
195 }
196 ObjectChange::Deleted {
197 sender,
198 object_type,
199 object_id,
200 version,
201 } => {
202 write!(
203 f,
204 " ┌──\n │ ObjectId: {}\n │ Sender: {} \n │ ObjectType: {} \n │ Version: {}\n └──",
205 object_id, sender, object_type, version
206 )
207 }
208 ObjectChange::Wrapped {
209 sender,
210 object_type,
211 object_id,
212 version,
213 } => {
214 write!(
215 f,
216 " ┌──\n │ ObjectId: {}\n │ Sender: {} \n │ ObjectType: {} \n │ Version: {}\n └──",
217 object_id, sender, object_type, version
218 )
219 }
220 ObjectChange::Created {
221 sender,
222 owner,
223 object_type,
224 object_id,
225 version,
226 digest,
227 } => {
228 write!(
229 f,
230 " ┌──\n │ ObjectId: {}\n │ Sender: {} \n │ Owner: {}\n │ ObjectType: {} \n │ Version: {}\n │ Digest: {}\n └──",
231 object_id, sender, owner, object_type, version, digest
232 )
233 }
234 }
235 }
236}