sui_rpc/proto/sui/rpc/v2beta2/
execution_status.rs1use super::*;
2use crate::proto::TryFromProtoError;
3use tap::Pipe;
4
5impl From<sui_sdk_types::ExecutionStatus> for ExecutionStatus {
10 fn from(value: sui_sdk_types::ExecutionStatus) -> Self {
11 match value {
12 sui_sdk_types::ExecutionStatus::Success => Self {
13 success: Some(true),
14 error: None,
15 },
16 sui_sdk_types::ExecutionStatus::Failure { error, command } => {
17 let mut error_message = ExecutionError::from(error);
18 error_message.command = command;
19 Self {
20 success: Some(false),
21 error: Some(error_message),
22 }
23 }
24 }
25 }
26}
27
28impl TryFrom<&ExecutionStatus> for sui_sdk_types::ExecutionStatus {
29 type Error = TryFromProtoError;
30
31 fn try_from(value: &ExecutionStatus) -> Result<Self, Self::Error> {
32 let success = value
33 .success
34 .ok_or_else(|| TryFromProtoError::missing(ExecutionStatus::SUCCESS_FIELD))?;
35 match (success, &value.error) {
36 (true, None) => Self::Success,
37 (false, Some(error)) => Self::Failure {
38 error: sui_sdk_types::ExecutionError::try_from(error)
39 .map_err(|e| e.nested(ExecutionStatus::ERROR_FIELD))?,
40 command: error.command,
41 },
42 (true, Some(_)) | (false, None) => {
43 return Err(TryFromProtoError::invalid(
44 ExecutionStatus::ERROR_FIELD,
45 "invalid execution status",
46 ));
47 }
48 }
49 .pipe(Ok)
50 }
51}
52
53impl From<sui_sdk_types::ExecutionError> for ExecutionError {
58 fn from(value: sui_sdk_types::ExecutionError) -> Self {
59 use execution_error::ErrorDetails;
60 use execution_error::ExecutionErrorKind;
61 use sui_sdk_types::ExecutionError as E;
62
63 let mut message = Self::default();
64
65 let kind = match value {
66 E::InsufficientGas => ExecutionErrorKind::InsufficientGas,
67 E::InvalidGasObject => ExecutionErrorKind::InvalidGasObject,
68 E::InvariantViolation => ExecutionErrorKind::InvariantViolation,
69 E::FeatureNotYetSupported => ExecutionErrorKind::FeatureNotYetSupported,
70 E::ObjectTooBig {
71 object_size,
72 max_object_size,
73 } => {
74 message.error_details = Some(ErrorDetails::SizeError(SizeError {
75 size: Some(object_size),
76 max_size: Some(max_object_size),
77 }));
78 ExecutionErrorKind::ObjectTooBig
79 }
80 E::PackageTooBig {
81 object_size,
82 max_object_size,
83 } => {
84 message.error_details = Some(ErrorDetails::SizeError(SizeError {
85 size: Some(object_size),
86 max_size: Some(max_object_size),
87 }));
88 ExecutionErrorKind::PackageTooBig
89 }
90 E::CircularObjectOwnership { object } => {
91 message.error_details = Some(ErrorDetails::ObjectId(object.to_string()));
92 ExecutionErrorKind::CircularObjectOwnership
93 }
94 E::InsufficientCoinBalance => ExecutionErrorKind::InsufficientCoinBalance,
95 E::CoinBalanceOverflow => ExecutionErrorKind::CoinBalanceOverflow,
96 E::PublishErrorNonZeroAddress => ExecutionErrorKind::PublishErrorNonZeroAddress,
97 E::SuiMoveVerificationError => ExecutionErrorKind::SuiMoveVerificationError,
98 E::MovePrimitiveRuntimeError { location } => {
99 message.error_details = location.map(|l| {
100 ErrorDetails::Abort(MoveAbort {
101 location: Some(l.into()),
102 ..Default::default()
103 })
104 });
105 ExecutionErrorKind::MovePrimitiveRuntimeError
106 }
107 E::MoveAbort { location, code } => {
108 message.error_details = Some(ErrorDetails::Abort(MoveAbort {
109 abort_code: Some(code),
110 location: Some(location.into()),
111 clever_error: None,
112 }));
113 ExecutionErrorKind::MoveAbort
114 }
115 E::VmVerificationOrDeserializationError => {
116 ExecutionErrorKind::VmVerificationOrDeserializationError
117 }
118 E::VmInvariantViolation => ExecutionErrorKind::VmInvariantViolation,
119 E::FunctionNotFound => ExecutionErrorKind::FunctionNotFound,
120 E::ArityMismatch => ExecutionErrorKind::ArityMismatch,
121 E::TypeArityMismatch => ExecutionErrorKind::TypeArityMismatch,
122 E::NonEntryFunctionInvoked => ExecutionErrorKind::NonEntryFunctionInvoked,
123 E::CommandArgumentError { argument, kind } => {
124 let mut command_argument_error = CommandArgumentError::from(kind);
125 command_argument_error.argument = Some(argument.into());
126 message.error_details =
127 Some(ErrorDetails::CommandArgumentError(command_argument_error));
128 ExecutionErrorKind::CommandArgumentError
129 }
130 E::TypeArgumentError {
131 type_argument,
132 kind,
133 } => {
134 let type_argument_error = TypeArgumentError {
135 type_argument: Some(type_argument.into()),
136 kind: Some(type_argument_error::TypeArgumentErrorKind::from(kind).into()),
137 };
138 message.error_details = Some(ErrorDetails::TypeArgumentError(type_argument_error));
139 ExecutionErrorKind::TypeArgumentError
140 }
141 E::UnusedValueWithoutDrop { result, subresult } => {
142 message.error_details = Some(ErrorDetails::IndexError(IndexError {
143 index: Some(result.into()),
144 subresult: Some(subresult.into()),
145 }));
146 ExecutionErrorKind::UnusedValueWithoutDrop
147 }
148 E::InvalidPublicFunctionReturnType { index } => {
149 message.error_details = Some(ErrorDetails::IndexError(IndexError {
150 index: Some(index.into()),
151 subresult: None,
152 }));
153 ExecutionErrorKind::InvalidPublicFunctionReturnType
154 }
155 E::InvalidTransferObject => ExecutionErrorKind::InvalidTransferObject,
156 E::EffectsTooLarge {
157 current_size,
158 max_size,
159 } => {
160 message.error_details = Some(ErrorDetails::SizeError(SizeError {
161 size: Some(current_size),
162 max_size: Some(max_size),
163 }));
164 ExecutionErrorKind::EffectsTooLarge
165 }
166 E::PublishUpgradeMissingDependency => {
167 ExecutionErrorKind::PublishUpgradeMissingDependency
168 }
169 E::PublishUpgradeDependencyDowngrade => {
170 ExecutionErrorKind::PublishUpgradeDependencyDowngrade
171 }
172 E::PackageUpgradeError { kind } => {
173 message.error_details = Some(ErrorDetails::PackageUpgradeError(kind.into()));
174 ExecutionErrorKind::PackageUpgradeError
175 }
176 E::WrittenObjectsTooLarge {
177 object_size,
178 max_object_size,
179 } => {
180 message.error_details = Some(ErrorDetails::SizeError(SizeError {
181 size: Some(object_size),
182 max_size: Some(max_object_size),
183 }));
184
185 ExecutionErrorKind::WrittenObjectsTooLarge
186 }
187 E::CertificateDenied => ExecutionErrorKind::CertificateDenied,
188 E::SuiMoveVerificationTimedout => ExecutionErrorKind::SuiMoveVerificationTimedout,
189 E::ConsensusObjectOperationNotAllowed => {
190 ExecutionErrorKind::ConsensusObjectOperationNotAllowed
191 }
192 E::InputObjectDeleted => ExecutionErrorKind::InputObjectDeleted,
193 E::ExecutionCanceledDueToConsensusObjectCongestion { congested_objects } => {
194 message.error_details = Some(ErrorDetails::CongestedObjects(CongestedObjects {
195 objects: congested_objects.iter().map(ToString::to_string).collect(),
196 }));
197
198 ExecutionErrorKind::ExecutionCanceledDueToConsensusObjectCongestion
199 }
200 E::AddressDeniedForCoin { address, coin_type } => {
201 message.error_details = Some(ErrorDetails::CoinDenyListError(CoinDenyListError {
202 address: Some(address.to_string()),
203 coin_type: Some(coin_type),
204 }));
205 ExecutionErrorKind::AddressDeniedForCoin
206 }
207 E::CoinTypeGlobalPause { coin_type } => {
208 message.error_details = Some(ErrorDetails::CoinDenyListError(CoinDenyListError {
209 address: None,
210 coin_type: Some(coin_type),
211 }));
212 ExecutionErrorKind::CoinTypeGlobalPause
213 }
214 E::ExecutionCanceledDueToRandomnessUnavailable => {
215 ExecutionErrorKind::ExecutionCanceledDueToRandomnessUnavailable
216 }
217 E::MoveVectorElemTooBig {
218 value_size,
219 max_scaled_size,
220 } => {
221 message.error_details = Some(ErrorDetails::SizeError(SizeError {
222 size: Some(value_size),
223 max_size: Some(max_scaled_size),
224 }));
225
226 ExecutionErrorKind::MoveVectorElemTooBig
227 }
228 E::MoveRawValueTooBig {
229 value_size,
230 max_scaled_size,
231 } => {
232 message.error_details = Some(ErrorDetails::SizeError(SizeError {
233 size: Some(value_size),
234 max_size: Some(max_scaled_size),
235 }));
236 ExecutionErrorKind::MoveRawValueTooBig
237 }
238 E::InvalidLinkage => ExecutionErrorKind::InvalidLinkage,
239 _ => ExecutionErrorKind::Unknown,
240 };
241
242 message.set_kind(kind);
243 message
244 }
245}
246
247impl TryFrom<&ExecutionError> for sui_sdk_types::ExecutionError {
248 type Error = TryFromProtoError;
249
250 fn try_from(value: &ExecutionError) -> Result<Self, Self::Error> {
251 use execution_error::ErrorDetails;
252 use execution_error::ExecutionErrorKind as K;
253
254 match value.kind() {
255 K::Unknown => return Err(TryFromProtoError::invalid(ExecutionError::KIND_FIELD, "unknown ExecutionErrorKind")),
256 K::InsufficientGas => Self::InsufficientGas,
257 K::InvalidGasObject => Self::InvalidGasObject,
258 K::InvariantViolation => Self::InvariantViolation,
259 K::FeatureNotYetSupported => Self::FeatureNotYetSupported,
260 K::ObjectTooBig => {
261 let Some(ErrorDetails::SizeError(SizeError { size, max_size })) =
262 &value.error_details
263 else {
264 return Err(TryFromProtoError::missing(ExecutionError::SIZE_ERROR_FIELD));
265 };
266 Self::ObjectTooBig {
267 object_size: size.ok_or_else(|| TryFromProtoError::missing(SizeError::SIZE_FIELD))?,
268 max_object_size: max_size
269 .ok_or_else(|| TryFromProtoError::missing(SizeError::MAX_SIZE_FIELD))?,
270 }
271 }
272 K::PackageTooBig => {
273 let Some(ErrorDetails::SizeError(SizeError { size, max_size })) =
274 &value.error_details
275 else {
276 return Err(TryFromProtoError::missing(ExecutionError::SIZE_ERROR_FIELD));
277 };
278 Self::PackageTooBig {
279 object_size: size.ok_or_else(|| TryFromProtoError::missing(SizeError::SIZE_FIELD))?,
280 max_object_size: max_size
281 .ok_or_else(|| TryFromProtoError::missing(SizeError::MAX_SIZE_FIELD))?,
282 }
283 }
284 K::CircularObjectOwnership => {
285 let Some(ErrorDetails::ObjectId(object_id)) = &value.error_details else {
286 return Err(TryFromProtoError::missing(ExecutionError::OBJECT_ID_FIELD));
287 };
288 Self::CircularObjectOwnership {
289 object: object_id.parse().map_err(|e| TryFromProtoError::invalid(ExecutionError::OBJECT_ID_FIELD, e))?,
290 }
291 }
292 K::InsufficientCoinBalance => Self::InsufficientCoinBalance,
293 K::CoinBalanceOverflow => Self::CoinBalanceOverflow,
294 K::PublishErrorNonZeroAddress => Self::PublishErrorNonZeroAddress,
295 K::SuiMoveVerificationError => Self::SuiMoveVerificationError,
296 K::MovePrimitiveRuntimeError => {
297 let location = if let Some(ErrorDetails::Abort(abort)) = &value.error_details {
298 abort.location.as_ref().map(TryInto::try_into).transpose()?
299 } else {
300 None
301 };
302 Self::MovePrimitiveRuntimeError { location }
303 }
304 K::MoveAbort => {
305 let Some(ErrorDetails::Abort(abort)) = &value.error_details else {
306 return Err(TryFromProtoError::missing("abort"));
307 };
308 Self::MoveAbort {
309 location: abort
310 .location
311 .as_ref()
312 .ok_or_else(|| TryFromProtoError::missing("location"))?
313 .try_into()?,
314 code: abort
315 .abort_code
316 .ok_or_else(|| TryFromProtoError::missing("abort_code"))?,
317 }
318 }
319 K::VmVerificationOrDeserializationError => Self::VmVerificationOrDeserializationError,
320 K::VmInvariantViolation => Self::VmInvariantViolation,
321 K::FunctionNotFound => Self::FunctionNotFound,
322 K::ArityMismatch => Self::ArityMismatch,
323 K::TypeArityMismatch => Self::TypeArityMismatch,
324 K::NonEntryFunctionInvoked => Self::NonEntryFunctionInvoked,
325 K::CommandArgumentError => {
326 let Some(ErrorDetails::CommandArgumentError(command_argument_error)) =
327 &value.error_details
328 else {
329 return Err(TryFromProtoError::missing("command_argument_error"));
330 };
331 Self::CommandArgumentError {
332 argument: command_argument_error
333 .argument
334 .ok_or_else(|| TryFromProtoError::missing("argument"))?
335 .try_into()
336 .map_err(|e| TryFromProtoError::invalid(CommandArgumentError::ARGUMENT_FIELD, e))?,
337 kind: command_argument_error.try_into()?,
338 }
339 }
340 K::TypeArgumentError => {
341 let Some(ErrorDetails::TypeArgumentError(type_argument_error)) =
342 &value.error_details
343 else {
344 return Err(TryFromProtoError::missing("type_argument_error"));
345 };
346 Self::TypeArgumentError {
347 type_argument: type_argument_error
348 .type_argument
349 .ok_or_else(|| TryFromProtoError::missing("type_argument"))?
350 .try_into()
351 .map_err(|e| TryFromProtoError::invalid(TypeArgumentError::TYPE_ARGUMENT_FIELD, e))?,
352 kind: type_argument_error.kind().try_into()?,
353 }
354 }
355 K::UnusedValueWithoutDrop => {
356 let Some(ErrorDetails::IndexError(IndexError { index, subresult })) =
357 &value.error_details
358 else {
359 return Err(TryFromProtoError::missing("index_error"));
360 };
361 Self::UnusedValueWithoutDrop {
362 result: index
363 .ok_or_else(|| TryFromProtoError::missing("result"))?
364 .try_into()
365 .map_err(|e| TryFromProtoError::invalid(IndexError::INDEX_FIELD, e))?,
366 subresult: subresult
367 .ok_or_else(|| TryFromProtoError::missing("subresult"))?
368 .try_into()
369 .map_err(|e| TryFromProtoError::invalid(IndexError::SUBRESULT_FIELD, e))?,
370 }
371 }
372 K::InvalidPublicFunctionReturnType => {
373 let Some(ErrorDetails::IndexError(IndexError { index, .. })) =
374 &value.error_details
375 else {
376 return Err(TryFromProtoError::missing("index_error"));
377 };
378 Self::InvalidPublicFunctionReturnType {
379 index: index
380 .ok_or_else(|| TryFromProtoError::missing("index"))?
381 .try_into()
382 .map_err(|e| TryFromProtoError::invalid(IndexError::INDEX_FIELD, e))?,
383 }
384 }
385 K::InvalidTransferObject => Self::InvalidTransferObject,
386 K::EffectsTooLarge => {
387 let Some(ErrorDetails::SizeError(SizeError { size, max_size })) =
388 &value.error_details
389 else {
390 return Err(TryFromProtoError::missing(ExecutionError::SIZE_ERROR_FIELD));
391 };
392 Self::EffectsTooLarge {
393 current_size: size.ok_or_else(|| TryFromProtoError::missing(SizeError::SIZE_FIELD))?,
394 max_size: max_size.ok_or_else(|| TryFromProtoError::missing(SizeError::MAX_SIZE_FIELD))?,
395 }
396 }
397 K::PublishUpgradeMissingDependency => Self::PublishUpgradeMissingDependency,
398 K::PublishUpgradeDependencyDowngrade => Self::PublishUpgradeDependencyDowngrade,
399 K::PackageUpgradeError => {
400 let Some(ErrorDetails::PackageUpgradeError(package_upgrade_error)) =
401 &value.error_details
402 else {
403 return Err(TryFromProtoError::missing("package_upgrade_error"));
404 };
405 Self::PackageUpgradeError {
406 kind: package_upgrade_error.try_into()?,
407 }
408 }
409 K::WrittenObjectsTooLarge => {
410 let Some(ErrorDetails::SizeError(SizeError { size, max_size })) =
411 &value.error_details
412 else {
413 return Err(TryFromProtoError::missing(ExecutionError::SIZE_ERROR_FIELD));
414 };
415
416 Self::WrittenObjectsTooLarge {
417 object_size: size.ok_or_else(|| TryFromProtoError::missing(SizeError::SIZE_FIELD))?,
418 max_object_size: max_size
419 .ok_or_else(|| TryFromProtoError::missing(SizeError::MAX_SIZE_FIELD))?,
420 }
421 }
422 K::CertificateDenied => Self::CertificateDenied,
423 K::SuiMoveVerificationTimedout => Self::SuiMoveVerificationTimedout,
424 K::ConsensusObjectOperationNotAllowed => Self::ConsensusObjectOperationNotAllowed,
425 K::InputObjectDeleted => Self::InputObjectDeleted,
426 K::ExecutionCanceledDueToConsensusObjectCongestion => {
427 let Some(ErrorDetails::CongestedObjects(CongestedObjects { objects })) =
428 &value.error_details
429 else {
430 return Err(TryFromProtoError::missing("congested_objects"));
431 };
432
433 Self::ExecutionCanceledDueToConsensusObjectCongestion {
434 congested_objects: objects
435 .iter()
436 .map(|s| s.parse())
437 .collect::<Result<_, _>>()
438 .map_err(|e| TryFromProtoError::invalid(CongestedObjects::OBJECTS_FIELD, e))?,
439 }
440 }
441 K::AddressDeniedForCoin => {
442 let Some(ErrorDetails::CoinDenyListError(CoinDenyListError {
443 address,
444 coin_type,
445 })) = &value.error_details
446 else {
447 return Err(TryFromProtoError::missing("coin_deny_list_error"));
448 };
449 Self::AddressDeniedForCoin {
450 address: address
451 .as_ref()
452 .ok_or_else(|| TryFromProtoError::missing("address"))?
453 .parse()
454 .map_err(|e| TryFromProtoError::invalid(CoinDenyListError::ADDRESS_FIELD, e))?,
455 coin_type: coin_type
456 .as_ref()
457 .ok_or_else(|| TryFromProtoError::missing("coin_type"))?
458 .to_owned(),
459 }
460 }
461 K::CoinTypeGlobalPause => {
462 let Some(ErrorDetails::CoinDenyListError(CoinDenyListError {
463 coin_type,
464 ..
465 })) = &value.error_details
466 else {
467 return Err(TryFromProtoError::missing("coin_deny_list_error"));
468 };
469 Self::CoinTypeGlobalPause {
470 coin_type: coin_type
471 .as_ref()
472 .ok_or_else(|| TryFromProtoError::missing("coin_type"))?
473 .to_owned(),
474 }
475 }
476 K::ExecutionCanceledDueToRandomnessUnavailable => {
477 Self::ExecutionCanceledDueToRandomnessUnavailable
478 }
479 K::MoveVectorElemTooBig => {
480 let Some(ErrorDetails::SizeError(SizeError { size, max_size })) =
481 &value.error_details
482 else {
483 return Err(TryFromProtoError::missing(ExecutionError::SIZE_ERROR_FIELD));
484 };
485
486 Self::MoveVectorElemTooBig {
487 value_size: size.ok_or_else(|| TryFromProtoError::missing(SizeError::SIZE_FIELD))?,
488 max_scaled_size: max_size
489 .ok_or_else(|| TryFromProtoError::missing(SizeError::MAX_SIZE_FIELD))?,
490 }
491 }
492 K::MoveRawValueTooBig => {
493 let Some(ErrorDetails::SizeError(SizeError { size, max_size })) =
494 &value.error_details
495 else {
496 return Err(TryFromProtoError::missing(ExecutionError::SIZE_ERROR_FIELD));
497 };
498
499 Self::MoveRawValueTooBig {
500 value_size: size.ok_or_else(|| TryFromProtoError::missing(SizeError::SIZE_FIELD))?,
501 max_scaled_size: max_size
502 .ok_or_else(|| TryFromProtoError::missing(SizeError::MAX_SIZE_FIELD))?,
503 }
504 }
505 K::InvalidLinkage => Self::InvalidLinkage,
506 }
507 .pipe(Ok)
508 }
509}
510
511impl From<sui_sdk_types::CommandArgumentError> for CommandArgumentError {
516 fn from(value: sui_sdk_types::CommandArgumentError) -> Self {
517 use command_argument_error::CommandArgumentErrorKind;
518 use sui_sdk_types::CommandArgumentError as E;
519
520 let mut message = Self::default();
521
522 let kind = match value {
523 E::TypeMismatch => CommandArgumentErrorKind::TypeMismatch,
524 E::InvalidBcsBytes => CommandArgumentErrorKind::InvalidBcsBytes,
525 E::InvalidUsageOfPureArgument => CommandArgumentErrorKind::InvalidUsageOfPureArgument,
526 E::InvalidArgumentToPrivateEntryFunction => {
527 CommandArgumentErrorKind::InvalidArgumentToPrivateEntryFunction
528 }
529 E::IndexOutOfBounds { index } => {
530 message.index_error = Some(IndexError {
531 index: Some(index.into()),
532 subresult: None,
533 });
534 CommandArgumentErrorKind::IndexOutOfBounds
535 }
536 E::SecondaryIndexOutOfBounds { result, subresult } => {
537 message.index_error = Some(IndexError {
538 index: Some(result.into()),
539 subresult: Some(subresult.into()),
540 });
541 CommandArgumentErrorKind::SecondaryIndexOutOfBounds
542 }
543 E::InvalidResultArity { result } => {
544 message.index_error = Some(IndexError {
545 index: Some(result.into()),
546 subresult: None,
547 });
548 CommandArgumentErrorKind::InvalidResultArity
549 }
550 E::InvalidGasCoinUsage => CommandArgumentErrorKind::InvalidGasCoinUsage,
551 E::InvalidValueUsage => CommandArgumentErrorKind::InvalidValueUsage,
552 E::InvalidObjectByValue => CommandArgumentErrorKind::InvalidObjectByValue,
553 E::InvalidObjectByMutRef => CommandArgumentErrorKind::InvalidObjectByMutRef,
554 E::ConsensusObjectOperationNotAllowed => {
555 CommandArgumentErrorKind::ConsensusObjectOperationNotAllowed
556 }
557 E::InvalidArgumentArity => CommandArgumentErrorKind::InvalidArgumentArity,
558 _ => CommandArgumentErrorKind::Unknown,
559 };
560
561 message.set_kind(kind);
562 message
563 }
564}
565
566impl TryFrom<&CommandArgumentError> for sui_sdk_types::CommandArgumentError {
567 type Error = TryFromProtoError;
568
569 fn try_from(value: &CommandArgumentError) -> Result<Self, Self::Error> {
570 use command_argument_error::CommandArgumentErrorKind as K;
571
572 match value.kind() {
573 K::Unknown => {
574 return Err(TryFromProtoError::invalid(
575 CommandArgumentError::KIND_FIELD,
576 "unknown CommandArgumentErrorKind",
577 ))
578 }
579 K::TypeMismatch => Self::TypeMismatch,
580 K::InvalidBcsBytes => Self::InvalidBcsBytes,
581 K::InvalidUsageOfPureArgument => Self::InvalidUsageOfPureArgument,
582 K::InvalidArgumentToPrivateEntryFunction => Self::InvalidArgumentToPrivateEntryFunction,
583 K::IndexOutOfBounds => Self::IndexOutOfBounds {
584 index: value
585 .index_error
586 .ok_or_else(|| TryFromProtoError::missing("index_error"))?
587 .index
588 .ok_or_else(|| TryFromProtoError::missing("index"))?
589 .try_into()
590 .map_err(|e| TryFromProtoError::invalid(IndexError::INDEX_FIELD, e))?,
591 },
592 K::SecondaryIndexOutOfBounds => {
593 let index_error = value
594 .index_error
595 .ok_or_else(|| TryFromProtoError::missing("index_error"))?;
596 Self::SecondaryIndexOutOfBounds {
597 result: index_error
598 .index
599 .ok_or_else(|| TryFromProtoError::missing("index"))?
600 .try_into()
601 .map_err(|e| TryFromProtoError::invalid(IndexError::INDEX_FIELD, e))?,
602 subresult: index_error
603 .subresult
604 .ok_or_else(|| TryFromProtoError::missing("subresult"))?
605 .try_into()
606 .map_err(|e| TryFromProtoError::invalid(IndexError::SUBRESULT_FIELD, e))?,
607 }
608 }
609 K::InvalidResultArity => Self::InvalidResultArity {
610 result: value
611 .index_error
612 .ok_or_else(|| TryFromProtoError::missing("index_error"))?
613 .index
614 .ok_or_else(|| TryFromProtoError::missing("index"))?
615 .try_into()
616 .map_err(|e| TryFromProtoError::invalid(IndexError::INDEX_FIELD, e))?,
617 },
618 K::InvalidGasCoinUsage => Self::InvalidGasCoinUsage,
619 K::InvalidValueUsage => Self::InvalidValueUsage,
620 K::InvalidObjectByValue => Self::InvalidObjectByValue,
621 K::InvalidObjectByMutRef => Self::InvalidObjectByMutRef,
622 K::ConsensusObjectOperationNotAllowed => Self::ConsensusObjectOperationNotAllowed,
623 K::InvalidArgumentArity => Self::InvalidArgumentArity,
624 }
625 .pipe(Ok)
626 }
627}
628
629impl From<sui_sdk_types::TypeArgumentError> for type_argument_error::TypeArgumentErrorKind {
634 fn from(value: sui_sdk_types::TypeArgumentError) -> Self {
635 use sui_sdk_types::TypeArgumentError::*;
636
637 match value {
638 TypeNotFound => Self::TypeNotFound,
639 ConstraintNotSatisfied => Self::ConstraintNotSatisfied,
640 _ => Self::Unknown,
641 }
642 }
643}
644
645impl TryFrom<type_argument_error::TypeArgumentErrorKind> for sui_sdk_types::TypeArgumentError {
646 type Error = TryFromProtoError;
647
648 fn try_from(value: type_argument_error::TypeArgumentErrorKind) -> Result<Self, Self::Error> {
649 use type_argument_error::TypeArgumentErrorKind as K;
650
651 match value {
652 K::Unknown => {
653 return Err(TryFromProtoError::invalid(
654 "kind",
655 "unknown TypeArgumentErrorKind",
656 ))
657 }
658 K::TypeNotFound => Self::TypeNotFound,
659 K::ConstraintNotSatisfied => Self::ConstraintNotSatisfied,
660 }
661 .pipe(Ok)
662 }
663}
664
665impl From<sui_sdk_types::PackageUpgradeError> for PackageUpgradeError {
670 fn from(value: sui_sdk_types::PackageUpgradeError) -> Self {
671 use package_upgrade_error::PackageUpgradeErrorKind;
672 use sui_sdk_types::PackageUpgradeError as E;
673
674 let mut message = Self::default();
675
676 let kind = match value {
677 E::UnableToFetchPackage { package_id } => {
678 message.package_id = Some(package_id.to_string());
679 PackageUpgradeErrorKind::UnableToFetchPackage
680 }
681 E::NotAPackage { object_id } => {
682 message.package_id = Some(object_id.to_string());
683 PackageUpgradeErrorKind::NotAPackage
684 }
685 E::IncompatibleUpgrade => PackageUpgradeErrorKind::IncompatibleUpgrade,
686 E::DigestDoesNotMatch { digest } => {
687 message.digest = Some(digest.to_string());
688 PackageUpgradeErrorKind::DigestDoesNotMatch
689 }
690 E::UnknownUpgradePolicy { policy } => {
691 message.policy = Some(policy.into());
692 PackageUpgradeErrorKind::UnknownUpgradePolicy
693 }
694 E::PackageIdDoesNotMatch {
695 package_id,
696 ticket_id,
697 } => {
698 message.package_id = Some(package_id.to_string());
699 message.ticket_id = Some(ticket_id.to_string());
700 PackageUpgradeErrorKind::PackageIdDoesNotMatch
701 }
702 _ => PackageUpgradeErrorKind::Unknown,
703 };
704
705 message.set_kind(kind);
706 message
707 }
708}
709
710impl TryFrom<&PackageUpgradeError> for sui_sdk_types::PackageUpgradeError {
711 type Error = TryFromProtoError;
712
713 fn try_from(value: &PackageUpgradeError) -> Result<Self, Self::Error> {
714 use package_upgrade_error::PackageUpgradeErrorKind as K;
715
716 match value.kind() {
717 K::Unknown => {
718 return Err(TryFromProtoError::invalid(
719 PackageUpgradeError::KIND_FIELD,
720 "unknown PackageUpgradeErrorKind",
721 ))
722 }
723 K::UnableToFetchPackage => Self::UnableToFetchPackage {
724 package_id: value
725 .package_id
726 .as_ref()
727 .ok_or_else(|| TryFromProtoError::missing("package_id"))?
728 .parse()
729 .map_err(|e| {
730 TryFromProtoError::invalid(PackageUpgradeError::PACKAGE_ID_FIELD, e)
731 })?,
732 },
733 K::NotAPackage => Self::NotAPackage {
734 object_id: value
735 .package_id
736 .as_ref()
737 .ok_or_else(|| TryFromProtoError::missing("package_id"))?
738 .parse()
739 .map_err(|e| {
740 TryFromProtoError::invalid(PackageUpgradeError::PACKAGE_ID_FIELD, e)
741 })?,
742 },
743 K::IncompatibleUpgrade => Self::IncompatibleUpgrade,
744 K::DigestDoesNotMatch => Self::DigestDoesNotMatch {
745 digest: value
746 .digest
747 .as_ref()
748 .ok_or_else(|| TryFromProtoError::missing("digest"))?
749 .parse()
750 .map_err(|e| {
751 TryFromProtoError::invalid(PackageUpgradeError::DIGEST_FIELD, e)
752 })?,
753 },
754 K::UnknownUpgradePolicy => Self::UnknownUpgradePolicy {
755 policy: value
756 .policy
757 .ok_or_else(|| TryFromProtoError::missing("policy"))?
758 .try_into()
759 .map_err(|e| {
760 TryFromProtoError::invalid(PackageUpgradeError::POLICY_FIELD, e)
761 })?,
762 },
763 K::PackageIdDoesNotMatch => Self::PackageIdDoesNotMatch {
764 package_id: value
765 .package_id
766 .as_ref()
767 .ok_or_else(|| TryFromProtoError::missing("package_id"))?
768 .parse()
769 .map_err(|e| {
770 TryFromProtoError::invalid(PackageUpgradeError::PACKAGE_ID_FIELD, e)
771 })?,
772 ticket_id: value
773 .ticket_id
774 .as_ref()
775 .ok_or_else(|| TryFromProtoError::missing("ticket_id"))?
776 .parse()
777 .map_err(|e| {
778 TryFromProtoError::invalid(PackageUpgradeError::TICKET_ID_FIELD, e)
779 })?,
780 },
781 }
782 .pipe(Ok)
783 }
784}
785
786impl From<sui_sdk_types::MoveLocation> for MoveLocation {
791 fn from(value: sui_sdk_types::MoveLocation) -> Self {
792 Self {
793 package: Some(value.package.to_string()),
794 module: Some(value.module.to_string()),
795 function: Some(value.function.into()),
796 instruction: Some(value.instruction.into()),
797 function_name: value.function_name.map(|name| name.to_string()),
798 }
799 }
800}
801
802impl TryFrom<&MoveLocation> for sui_sdk_types::MoveLocation {
803 type Error = TryFromProtoError;
804
805 fn try_from(value: &MoveLocation) -> Result<Self, Self::Error> {
806 let package = value
807 .package
808 .as_ref()
809 .ok_or_else(|| TryFromProtoError::missing("package"))?
810 .parse()
811 .map_err(|e| TryFromProtoError::invalid(MoveLocation::PACKAGE_FIELD, e))?;
812 let module = value
813 .module
814 .as_ref()
815 .ok_or_else(|| TryFromProtoError::missing("module"))?
816 .parse()
817 .map_err(|e| TryFromProtoError::invalid(MoveLocation::MODULE_FIELD, e))?;
818 let function = value
819 .function
820 .ok_or_else(|| TryFromProtoError::missing("function"))?
821 .try_into()
822 .map_err(|e| TryFromProtoError::invalid(MoveLocation::FUNCTION_FIELD, e))?;
823 let instruction = value
824 .instruction
825 .ok_or_else(|| TryFromProtoError::missing("instruction"))?
826 .try_into()
827 .map_err(|e| TryFromProtoError::invalid(MoveLocation::INSTRUCTION_FIELD, e))?;
828 let function_name = value
829 .function_name
830 .as_ref()
831 .map(|name| {
832 name.parse()
833 .map_err(|e| TryFromProtoError::invalid(MoveLocation::FUNCTION_NAME_FIELD, e))
834 })
835 .transpose()?;
836
837 Ok(Self {
838 package,
839 module,
840 function,
841 instruction,
842 function_name,
843 })
844 }
845}