Skip to main content

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

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