Skip to main content

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

1use super::*;
2use crate::proto::TryFromProtoError;
3use tap::Pipe;
4
5//
6// ExecutionStatus
7//
8
9impl 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
53//
54// ExecutionError
55//
56
57impl 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            E::InsufficientFundsForWithdraw => ExecutionErrorKind::InsufficientFundsForWithdraw,
240            E::NonExclusiveWriteInputObjectModified { object } => {
241                message.set_object_id(object);
242                ExecutionErrorKind::NonExclusiveWriteInputObjectModified
243            }
244            _ => ExecutionErrorKind::Unknown,
245        };
246
247        message.set_kind(kind);
248        message
249    }
250}
251
252impl TryFrom<&ExecutionError> for sui_sdk_types::ExecutionError {
253    type Error = TryFromProtoError;
254
255    fn try_from(value: &ExecutionError) -> Result<Self, Self::Error> {
256        use execution_error::ErrorDetails;
257        use execution_error::ExecutionErrorKind as K;
258
259        match value.kind() {
260            K::Unknown => return Err(TryFromProtoError::invalid(ExecutionError::KIND_FIELD, "unknown ExecutionErrorKind")),
261            K::InsufficientGas => Self::InsufficientGas,
262            K::InvalidGasObject => Self::InvalidGasObject,
263            K::InvariantViolation => Self::InvariantViolation,
264            K::FeatureNotYetSupported => Self::FeatureNotYetSupported,
265            K::ObjectTooBig => {
266                let Some(ErrorDetails::SizeError(SizeError { size, max_size })) =
267                    &value.error_details
268                else {
269                    return Err(TryFromProtoError::missing(ExecutionError::SIZE_ERROR_FIELD));
270                };
271                Self::ObjectTooBig {
272                    object_size: size.ok_or_else(|| TryFromProtoError::missing(SizeError::SIZE_FIELD))?,
273                    max_object_size: max_size
274                        .ok_or_else(|| TryFromProtoError::missing(SizeError::MAX_SIZE_FIELD))?,
275                }
276            }
277            K::PackageTooBig => {
278                let Some(ErrorDetails::SizeError(SizeError { size, max_size })) =
279                    &value.error_details
280                else {
281                    return Err(TryFromProtoError::missing(ExecutionError::SIZE_ERROR_FIELD));
282                };
283                Self::PackageTooBig {
284                    object_size: size.ok_or_else(|| TryFromProtoError::missing(SizeError::SIZE_FIELD))?,
285                    max_object_size: max_size
286                        .ok_or_else(|| TryFromProtoError::missing(SizeError::MAX_SIZE_FIELD))?,
287                }
288            }
289            K::CircularObjectOwnership => {
290                let Some(ErrorDetails::ObjectId(object_id)) = &value.error_details else {
291                    return Err(TryFromProtoError::missing(ExecutionError::OBJECT_ID_FIELD));
292                };
293                Self::CircularObjectOwnership {
294                    object: object_id.parse().map_err(|e| TryFromProtoError::invalid(ExecutionError::OBJECT_ID_FIELD, e))?,
295                }
296            }
297            K::InsufficientCoinBalance => Self::InsufficientCoinBalance,
298            K::CoinBalanceOverflow => Self::CoinBalanceOverflow,
299            K::PublishErrorNonZeroAddress => Self::PublishErrorNonZeroAddress,
300            K::SuiMoveVerificationError => Self::SuiMoveVerificationError,
301            K::MovePrimitiveRuntimeError => {
302                let location = if let Some(ErrorDetails::Abort(abort)) = &value.error_details {
303                    abort.location.as_ref().map(TryInto::try_into).transpose()?
304                } else {
305                    None
306                };
307                Self::MovePrimitiveRuntimeError { location }
308            }
309            K::MoveAbort => {
310                let Some(ErrorDetails::Abort(abort)) = &value.error_details else {
311                    return Err(TryFromProtoError::missing("abort"));
312                };
313                Self::MoveAbort {
314                    location: abort
315                        .location
316                        .as_ref()
317                        .ok_or_else(|| TryFromProtoError::missing("location"))?
318                        .try_into()?,
319                    code: abort
320                        .abort_code
321                        .ok_or_else(|| TryFromProtoError::missing("abort_code"))?,
322                }
323            }
324            K::VmVerificationOrDeserializationError => Self::VmVerificationOrDeserializationError,
325            K::VmInvariantViolation => Self::VmInvariantViolation,
326            K::FunctionNotFound => Self::FunctionNotFound,
327            K::ArityMismatch => Self::ArityMismatch,
328            K::TypeArityMismatch => Self::TypeArityMismatch,
329            K::NonEntryFunctionInvoked => Self::NonEntryFunctionInvoked,
330            K::CommandArgumentError => {
331                let Some(ErrorDetails::CommandArgumentError(command_argument_error)) =
332                    &value.error_details
333                else {
334                    return Err(TryFromProtoError::missing("command_argument_error"));
335                };
336                Self::CommandArgumentError {
337                    argument: command_argument_error
338                        .argument
339                        .ok_or_else(|| TryFromProtoError::missing("argument"))?
340                        .try_into()
341                        .map_err(|e| TryFromProtoError::invalid(CommandArgumentError::ARGUMENT_FIELD, e))?,
342                    kind: command_argument_error.try_into()?,
343                }
344            }
345            K::TypeArgumentError => {
346                let Some(ErrorDetails::TypeArgumentError(type_argument_error)) =
347                    &value.error_details
348                else {
349                    return Err(TryFromProtoError::missing("type_argument_error"));
350                };
351                Self::TypeArgumentError {
352                    type_argument: type_argument_error
353                        .type_argument
354                        .ok_or_else(|| TryFromProtoError::missing("type_argument"))?
355                        .try_into()
356                        .map_err(|e| TryFromProtoError::invalid(TypeArgumentError::TYPE_ARGUMENT_FIELD, e))?,
357                    kind: type_argument_error.kind().try_into()?,
358                }
359            }
360            K::UnusedValueWithoutDrop => {
361                let Some(ErrorDetails::IndexError(IndexError { index, subresult })) =
362                    &value.error_details
363                else {
364                    return Err(TryFromProtoError::missing("index_error"));
365                };
366                Self::UnusedValueWithoutDrop {
367                    result: index
368                        .ok_or_else(|| TryFromProtoError::missing("result"))?
369                        .try_into()
370                        .map_err(|e| TryFromProtoError::invalid(IndexError::INDEX_FIELD, e))?,
371                    subresult: subresult
372                        .ok_or_else(|| TryFromProtoError::missing("subresult"))?
373                        .try_into()
374                        .map_err(|e| TryFromProtoError::invalid(IndexError::SUBRESULT_FIELD, e))?,
375                }
376            }
377            K::InvalidPublicFunctionReturnType => {
378                let Some(ErrorDetails::IndexError(IndexError { index, .. })) =
379                    &value.error_details
380                else {
381                    return Err(TryFromProtoError::missing("index_error"));
382                };
383                Self::InvalidPublicFunctionReturnType {
384                    index: index
385                        .ok_or_else(|| TryFromProtoError::missing("index"))?
386                        .try_into()
387                        .map_err(|e| TryFromProtoError::invalid(IndexError::INDEX_FIELD, e))?,
388                }
389            }
390            K::InvalidTransferObject => Self::InvalidTransferObject,
391            K::EffectsTooLarge => {
392                let Some(ErrorDetails::SizeError(SizeError { size, max_size })) =
393                    &value.error_details
394                else {
395                    return Err(TryFromProtoError::missing(ExecutionError::SIZE_ERROR_FIELD));
396                };
397                Self::EffectsTooLarge {
398                    current_size: size.ok_or_else(|| TryFromProtoError::missing(SizeError::SIZE_FIELD))?,
399                    max_size: max_size.ok_or_else(|| TryFromProtoError::missing(SizeError::MAX_SIZE_FIELD))?,
400                }
401            }
402            K::PublishUpgradeMissingDependency => Self::PublishUpgradeMissingDependency,
403            K::PublishUpgradeDependencyDowngrade => Self::PublishUpgradeDependencyDowngrade,
404            K::PackageUpgradeError => {
405                let Some(ErrorDetails::PackageUpgradeError(package_upgrade_error)) =
406                    &value.error_details
407                else {
408                    return Err(TryFromProtoError::missing("package_upgrade_error"));
409                };
410                Self::PackageUpgradeError {
411                    kind: package_upgrade_error.try_into()?,
412                }
413            }
414            K::WrittenObjectsTooLarge => {
415                let Some(ErrorDetails::SizeError(SizeError { size, max_size })) =
416                    &value.error_details
417                else {
418                    return Err(TryFromProtoError::missing(ExecutionError::SIZE_ERROR_FIELD));
419                };
420
421                Self::WrittenObjectsTooLarge {
422                    object_size: size.ok_or_else(|| TryFromProtoError::missing(SizeError::SIZE_FIELD))?,
423                    max_object_size: max_size
424                        .ok_or_else(|| TryFromProtoError::missing(SizeError::MAX_SIZE_FIELD))?,
425                }
426            }
427            K::CertificateDenied => Self::CertificateDenied,
428            K::SuiMoveVerificationTimedout => Self::SuiMoveVerificationTimedout,
429            K::ConsensusObjectOperationNotAllowed => Self::ConsensusObjectOperationNotAllowed,
430            K::InputObjectDeleted => Self::InputObjectDeleted,
431            K::ExecutionCanceledDueToConsensusObjectCongestion => {
432                let Some(ErrorDetails::CongestedObjects(CongestedObjects { objects })) =
433                    &value.error_details
434                else {
435                    return Err(TryFromProtoError::missing("congested_objects"));
436                };
437
438                Self::ExecutionCanceledDueToConsensusObjectCongestion {
439                    congested_objects: objects
440                        .iter()
441                        .map(|s| s.parse())
442                        .collect::<Result<_, _>>()
443                        .map_err(|e| TryFromProtoError::invalid(CongestedObjects::OBJECTS_FIELD, e))?,
444                }
445            }
446            K::AddressDeniedForCoin => {
447                let Some(ErrorDetails::CoinDenyListError(CoinDenyListError {
448                    address,
449                    coin_type,
450                })) = &value.error_details
451                else {
452                    return Err(TryFromProtoError::missing("coin_deny_list_error"));
453                };
454                Self::AddressDeniedForCoin {
455                    address: address
456                        .as_ref()
457                        .ok_or_else(|| TryFromProtoError::missing("address"))?
458                        .parse()
459                        .map_err(|e| TryFromProtoError::invalid(CoinDenyListError::ADDRESS_FIELD, e))?,
460                    coin_type: coin_type
461                        .as_ref()
462                        .ok_or_else(|| TryFromProtoError::missing("coin_type"))?
463                        .to_owned(),
464                }
465            }
466            K::CoinTypeGlobalPause => {
467                let Some(ErrorDetails::CoinDenyListError(CoinDenyListError {
468                    coin_type,
469                    ..
470                })) = &value.error_details
471                else {
472                    return Err(TryFromProtoError::missing("coin_deny_list_error"));
473                };
474                Self::CoinTypeGlobalPause {
475                    coin_type: coin_type
476                        .as_ref()
477                        .ok_or_else(|| TryFromProtoError::missing("coin_type"))?
478                        .to_owned(),
479                }
480            }
481            K::ExecutionCanceledDueToRandomnessUnavailable => {
482                Self::ExecutionCanceledDueToRandomnessUnavailable
483            }
484            K::MoveVectorElemTooBig => {
485                let Some(ErrorDetails::SizeError(SizeError { size, max_size })) =
486                    &value.error_details
487                else {
488                    return Err(TryFromProtoError::missing(ExecutionError::SIZE_ERROR_FIELD));
489                };
490
491                Self::MoveVectorElemTooBig {
492                    value_size: size.ok_or_else(|| TryFromProtoError::missing(SizeError::SIZE_FIELD))?,
493                    max_scaled_size: max_size
494                        .ok_or_else(|| TryFromProtoError::missing(SizeError::MAX_SIZE_FIELD))?,
495                }
496            }
497            K::MoveRawValueTooBig => {
498                let Some(ErrorDetails::SizeError(SizeError { size, max_size })) =
499                    &value.error_details
500                else {
501                    return Err(TryFromProtoError::missing(ExecutionError::SIZE_ERROR_FIELD));
502                };
503
504                Self::MoveRawValueTooBig {
505                    value_size: size.ok_or_else(|| TryFromProtoError::missing(SizeError::SIZE_FIELD))?,
506                    max_scaled_size: max_size
507                        .ok_or_else(|| TryFromProtoError::missing(SizeError::MAX_SIZE_FIELD))?,
508                }
509            }
510            K::InvalidLinkage => Self::InvalidLinkage,
511            K::InsufficientFundsForWithdraw => Self::InsufficientFundsForWithdraw,
512            K::NonExclusiveWriteInputObjectModified => Self::NonExclusiveWriteInputObjectModified {
513                object: value.object_id().parse().map_err(|e| TryFromProtoError::invalid("object_id", e))?
514            },
515        }
516        .pipe(Ok)
517    }
518}
519
520//
521// CommandArgumentError
522//
523
524impl From<sui_sdk_types::CommandArgumentError> for CommandArgumentError {
525    fn from(value: sui_sdk_types::CommandArgumentError) -> Self {
526        use command_argument_error::CommandArgumentErrorKind;
527        use sui_sdk_types::CommandArgumentError as E;
528
529        let mut message = Self::default();
530
531        let kind = match value {
532            E::TypeMismatch => CommandArgumentErrorKind::TypeMismatch,
533            E::InvalidBcsBytes => CommandArgumentErrorKind::InvalidBcsBytes,
534            E::InvalidUsageOfPureArgument => CommandArgumentErrorKind::InvalidUsageOfPureArgument,
535            E::InvalidArgumentToPrivateEntryFunction => {
536                CommandArgumentErrorKind::InvalidArgumentToPrivateEntryFunction
537            }
538            E::IndexOutOfBounds { index } => {
539                message.index_error = Some(IndexError {
540                    index: Some(index.into()),
541                    subresult: None,
542                });
543                CommandArgumentErrorKind::IndexOutOfBounds
544            }
545            E::SecondaryIndexOutOfBounds { result, subresult } => {
546                message.index_error = Some(IndexError {
547                    index: Some(result.into()),
548                    subresult: Some(subresult.into()),
549                });
550                CommandArgumentErrorKind::SecondaryIndexOutOfBounds
551            }
552            E::InvalidResultArity { result } => {
553                message.index_error = Some(IndexError {
554                    index: Some(result.into()),
555                    subresult: None,
556                });
557                CommandArgumentErrorKind::InvalidResultArity
558            }
559            E::InvalidGasCoinUsage => CommandArgumentErrorKind::InvalidGasCoinUsage,
560            E::InvalidValueUsage => CommandArgumentErrorKind::InvalidValueUsage,
561            E::InvalidObjectByValue => CommandArgumentErrorKind::InvalidObjectByValue,
562            E::InvalidObjectByMutRef => CommandArgumentErrorKind::InvalidObjectByMutRef,
563            E::ConsensusObjectOperationNotAllowed => {
564                CommandArgumentErrorKind::ConsensusObjectOperationNotAllowed
565            }
566            E::InvalidArgumentArity => CommandArgumentErrorKind::InvalidArgumentArity,
567            E::InvalidTransferObject => CommandArgumentErrorKind::InvalidTransferObject,
568            E::InvalidMakeMoveVecNonObjectArgument => {
569                CommandArgumentErrorKind::InvalidMakeMoveVecNonObjectArgument
570            }
571            E::ArgumentWithoutValue => CommandArgumentErrorKind::ArgumentWithoutValue,
572            E::CannotMoveBorrowedValue => CommandArgumentErrorKind::CannotMoveBorrowedValue,
573            E::CannotWriteToExtendedReference => {
574                CommandArgumentErrorKind::CannotWriteToExtendedReference
575            }
576            E::InvalidReferenceArgument => CommandArgumentErrorKind::InvalidReferenceArgument,
577            E::InvalidTxContext => CommandArgumentErrorKind::InvalidTxContext,
578            _ => CommandArgumentErrorKind::Unknown,
579        };
580
581        message.set_kind(kind);
582        message
583    }
584}
585
586impl TryFrom<&CommandArgumentError> for sui_sdk_types::CommandArgumentError {
587    type Error = TryFromProtoError;
588
589    fn try_from(value: &CommandArgumentError) -> Result<Self, Self::Error> {
590        use command_argument_error::CommandArgumentErrorKind as K;
591
592        match value.kind() {
593            K::Unknown => {
594                return Err(TryFromProtoError::invalid(
595                    CommandArgumentError::KIND_FIELD,
596                    "unknown CommandArgumentErrorKind",
597                ));
598            }
599            K::TypeMismatch => Self::TypeMismatch,
600            K::InvalidBcsBytes => Self::InvalidBcsBytes,
601            K::InvalidUsageOfPureArgument => Self::InvalidUsageOfPureArgument,
602            K::InvalidArgumentToPrivateEntryFunction => Self::InvalidArgumentToPrivateEntryFunction,
603            K::IndexOutOfBounds => Self::IndexOutOfBounds {
604                index: value
605                    .index_error
606                    .ok_or_else(|| TryFromProtoError::missing("index_error"))?
607                    .index
608                    .ok_or_else(|| TryFromProtoError::missing("index"))?
609                    .try_into()
610                    .map_err(|e| TryFromProtoError::invalid(IndexError::INDEX_FIELD, e))?,
611            },
612            K::SecondaryIndexOutOfBounds => {
613                let index_error = value
614                    .index_error
615                    .ok_or_else(|| TryFromProtoError::missing("index_error"))?;
616                Self::SecondaryIndexOutOfBounds {
617                    result: 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                    subresult: index_error
623                        .subresult
624                        .ok_or_else(|| TryFromProtoError::missing("subresult"))?
625                        .try_into()
626                        .map_err(|e| TryFromProtoError::invalid(IndexError::SUBRESULT_FIELD, e))?,
627                }
628            }
629            K::InvalidResultArity => Self::InvalidResultArity {
630                result: value
631                    .index_error
632                    .ok_or_else(|| TryFromProtoError::missing("index_error"))?
633                    .index
634                    .ok_or_else(|| TryFromProtoError::missing("index"))?
635                    .try_into()
636                    .map_err(|e| TryFromProtoError::invalid(IndexError::INDEX_FIELD, e))?,
637            },
638            K::InvalidGasCoinUsage => Self::InvalidGasCoinUsage,
639            K::InvalidValueUsage => Self::InvalidValueUsage,
640            K::InvalidObjectByValue => Self::InvalidObjectByValue,
641            K::InvalidObjectByMutRef => Self::InvalidObjectByMutRef,
642            K::ConsensusObjectOperationNotAllowed => Self::ConsensusObjectOperationNotAllowed,
643            K::InvalidArgumentArity => Self::InvalidArgumentArity,
644            K::InvalidTransferObject => Self::InvalidTransferObject,
645            K::InvalidMakeMoveVecNonObjectArgument => Self::InvalidMakeMoveVecNonObjectArgument,
646            K::ArgumentWithoutValue => Self::ArgumentWithoutValue,
647            K::CannotMoveBorrowedValue => Self::CannotMoveBorrowedValue,
648            K::CannotWriteToExtendedReference => Self::CannotWriteToExtendedReference,
649            K::InvalidReferenceArgument => Self::InvalidReferenceArgument,
650            K::InvalidTxContext => Self::InvalidTxContext,
651        }
652        .pipe(Ok)
653    }
654}
655
656//
657// TypeArgumentError
658//
659
660impl From<sui_sdk_types::TypeArgumentError> for type_argument_error::TypeArgumentErrorKind {
661    fn from(value: sui_sdk_types::TypeArgumentError) -> Self {
662        use sui_sdk_types::TypeArgumentError::*;
663
664        match value {
665            TypeNotFound => Self::TypeNotFound,
666            ConstraintNotSatisfied => Self::ConstraintNotSatisfied,
667            _ => Self::Unknown,
668        }
669    }
670}
671
672impl TryFrom<type_argument_error::TypeArgumentErrorKind> for sui_sdk_types::TypeArgumentError {
673    type Error = TryFromProtoError;
674
675    fn try_from(value: type_argument_error::TypeArgumentErrorKind) -> Result<Self, Self::Error> {
676        use type_argument_error::TypeArgumentErrorKind as K;
677
678        match value {
679            K::Unknown => {
680                return Err(TryFromProtoError::invalid(
681                    "kind",
682                    "unknown TypeArgumentErrorKind",
683                ));
684            }
685            K::TypeNotFound => Self::TypeNotFound,
686            K::ConstraintNotSatisfied => Self::ConstraintNotSatisfied,
687        }
688        .pipe(Ok)
689    }
690}
691
692//
693// PackageUpgradeError
694//
695
696impl From<sui_sdk_types::PackageUpgradeError> for PackageUpgradeError {
697    fn from(value: sui_sdk_types::PackageUpgradeError) -> Self {
698        use package_upgrade_error::PackageUpgradeErrorKind;
699        use sui_sdk_types::PackageUpgradeError as E;
700
701        let mut message = Self::default();
702
703        let kind = match value {
704            E::UnableToFetchPackage { package_id } => {
705                message.package_id = Some(package_id.to_string());
706                PackageUpgradeErrorKind::UnableToFetchPackage
707            }
708            E::NotAPackage { object_id } => {
709                message.package_id = Some(object_id.to_string());
710                PackageUpgradeErrorKind::NotAPackage
711            }
712            E::IncompatibleUpgrade => PackageUpgradeErrorKind::IncompatibleUpgrade,
713            E::DigestDoesNotMatch { digest } => {
714                message.digest = Some(digest.to_string());
715                PackageUpgradeErrorKind::DigestDoesNotMatch
716            }
717            E::UnknownUpgradePolicy { policy } => {
718                message.policy = Some(policy.into());
719                PackageUpgradeErrorKind::UnknownUpgradePolicy
720            }
721            E::PackageIdDoesNotMatch {
722                package_id,
723                ticket_id,
724            } => {
725                message.package_id = Some(package_id.to_string());
726                message.ticket_id = Some(ticket_id.to_string());
727                PackageUpgradeErrorKind::PackageIdDoesNotMatch
728            }
729            _ => PackageUpgradeErrorKind::Unknown,
730        };
731
732        message.set_kind(kind);
733        message
734    }
735}
736
737impl TryFrom<&PackageUpgradeError> for sui_sdk_types::PackageUpgradeError {
738    type Error = TryFromProtoError;
739
740    fn try_from(value: &PackageUpgradeError) -> Result<Self, Self::Error> {
741        use package_upgrade_error::PackageUpgradeErrorKind as K;
742
743        match value.kind() {
744            K::Unknown => {
745                return Err(TryFromProtoError::invalid(
746                    PackageUpgradeError::KIND_FIELD,
747                    "unknown PackageUpgradeErrorKind",
748                ));
749            }
750            K::UnableToFetchPackage => Self::UnableToFetchPackage {
751                package_id: value
752                    .package_id
753                    .as_ref()
754                    .ok_or_else(|| TryFromProtoError::missing("package_id"))?
755                    .parse()
756                    .map_err(|e| {
757                        TryFromProtoError::invalid(PackageUpgradeError::PACKAGE_ID_FIELD, e)
758                    })?,
759            },
760            K::NotAPackage => Self::NotAPackage {
761                object_id: value
762                    .package_id
763                    .as_ref()
764                    .ok_or_else(|| TryFromProtoError::missing("package_id"))?
765                    .parse()
766                    .map_err(|e| {
767                        TryFromProtoError::invalid(PackageUpgradeError::PACKAGE_ID_FIELD, e)
768                    })?,
769            },
770            K::IncompatibleUpgrade => Self::IncompatibleUpgrade,
771            K::DigestDoesNotMatch => Self::DigestDoesNotMatch {
772                digest: value
773                    .digest
774                    .as_ref()
775                    .ok_or_else(|| TryFromProtoError::missing("digest"))?
776                    .parse()
777                    .map_err(|e| {
778                        TryFromProtoError::invalid(PackageUpgradeError::DIGEST_FIELD, e)
779                    })?,
780            },
781            K::UnknownUpgradePolicy => Self::UnknownUpgradePolicy {
782                policy: value
783                    .policy
784                    .ok_or_else(|| TryFromProtoError::missing("policy"))?
785                    .try_into()
786                    .map_err(|e| {
787                        TryFromProtoError::invalid(PackageUpgradeError::POLICY_FIELD, e)
788                    })?,
789            },
790            K::PackageIdDoesNotMatch => Self::PackageIdDoesNotMatch {
791                package_id: value
792                    .package_id
793                    .as_ref()
794                    .ok_or_else(|| TryFromProtoError::missing("package_id"))?
795                    .parse()
796                    .map_err(|e| {
797                        TryFromProtoError::invalid(PackageUpgradeError::PACKAGE_ID_FIELD, e)
798                    })?,
799                ticket_id: value
800                    .ticket_id
801                    .as_ref()
802                    .ok_or_else(|| TryFromProtoError::missing("ticket_id"))?
803                    .parse()
804                    .map_err(|e| {
805                        TryFromProtoError::invalid(PackageUpgradeError::TICKET_ID_FIELD, e)
806                    })?,
807            },
808        }
809        .pipe(Ok)
810    }
811}
812
813//
814// MoveLocation
815//
816
817impl From<sui_sdk_types::MoveLocation> for MoveLocation {
818    fn from(value: sui_sdk_types::MoveLocation) -> Self {
819        Self {
820            package: Some(value.package.to_string()),
821            module: Some(value.module.to_string()),
822            function: Some(value.function.into()),
823            instruction: Some(value.instruction.into()),
824            function_name: value.function_name.map(|name| name.to_string()),
825        }
826    }
827}
828
829impl TryFrom<&MoveLocation> for sui_sdk_types::MoveLocation {
830    type Error = TryFromProtoError;
831
832    fn try_from(value: &MoveLocation) -> Result<Self, Self::Error> {
833        let package = value
834            .package
835            .as_ref()
836            .ok_or_else(|| TryFromProtoError::missing("package"))?
837            .parse()
838            .map_err(|e| TryFromProtoError::invalid(MoveLocation::PACKAGE_FIELD, e))?;
839        let module = value
840            .module
841            .as_ref()
842            .ok_or_else(|| TryFromProtoError::missing("module"))?
843            .parse()
844            .map_err(|e| TryFromProtoError::invalid(MoveLocation::MODULE_FIELD, e))?;
845        let function = value
846            .function
847            .ok_or_else(|| TryFromProtoError::missing("function"))?
848            .try_into()
849            .map_err(|e| TryFromProtoError::invalid(MoveLocation::FUNCTION_FIELD, e))?;
850        let instruction = value
851            .instruction
852            .ok_or_else(|| TryFromProtoError::missing("instruction"))?
853            .try_into()
854            .map_err(|e| TryFromProtoError::invalid(MoveLocation::INSTRUCTION_FIELD, e))?;
855        let function_name = value
856            .function_name
857            .as_ref()
858            .map(|name| {
859                name.parse()
860                    .map_err(|e| TryFromProtoError::invalid(MoveLocation::FUNCTION_NAME_FIELD, e))
861            })
862            .transpose()?;
863
864        Ok(Self {
865            package,
866            module,
867            function,
868            instruction,
869            function_name,
870        })
871    }
872}