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            _ => CommandArgumentErrorKind::Unknown,
578        };
579
580        message.set_kind(kind);
581        message
582    }
583}
584
585impl TryFrom<&CommandArgumentError> for sui_sdk_types::CommandArgumentError {
586    type Error = TryFromProtoError;
587
588    fn try_from(value: &CommandArgumentError) -> Result<Self, Self::Error> {
589        use command_argument_error::CommandArgumentErrorKind as K;
590
591        match value.kind() {
592            K::Unknown => {
593                return Err(TryFromProtoError::invalid(
594                    CommandArgumentError::KIND_FIELD,
595                    "unknown CommandArgumentErrorKind",
596                ));
597            }
598            K::TypeMismatch => Self::TypeMismatch,
599            K::InvalidBcsBytes => Self::InvalidBcsBytes,
600            K::InvalidUsageOfPureArgument => Self::InvalidUsageOfPureArgument,
601            K::InvalidArgumentToPrivateEntryFunction => Self::InvalidArgumentToPrivateEntryFunction,
602            K::IndexOutOfBounds => Self::IndexOutOfBounds {
603                index: value
604                    .index_error
605                    .ok_or_else(|| TryFromProtoError::missing("index_error"))?
606                    .index
607                    .ok_or_else(|| TryFromProtoError::missing("index"))?
608                    .try_into()
609                    .map_err(|e| TryFromProtoError::invalid(IndexError::INDEX_FIELD, e))?,
610            },
611            K::SecondaryIndexOutOfBounds => {
612                let index_error = value
613                    .index_error
614                    .ok_or_else(|| TryFromProtoError::missing("index_error"))?;
615                Self::SecondaryIndexOutOfBounds {
616                    result: index_error
617                        .index
618                        .ok_or_else(|| TryFromProtoError::missing("index"))?
619                        .try_into()
620                        .map_err(|e| TryFromProtoError::invalid(IndexError::INDEX_FIELD, e))?,
621                    subresult: index_error
622                        .subresult
623                        .ok_or_else(|| TryFromProtoError::missing("subresult"))?
624                        .try_into()
625                        .map_err(|e| TryFromProtoError::invalid(IndexError::SUBRESULT_FIELD, e))?,
626                }
627            }
628            K::InvalidResultArity => Self::InvalidResultArity {
629                result: value
630                    .index_error
631                    .ok_or_else(|| TryFromProtoError::missing("index_error"))?
632                    .index
633                    .ok_or_else(|| TryFromProtoError::missing("index"))?
634                    .try_into()
635                    .map_err(|e| TryFromProtoError::invalid(IndexError::INDEX_FIELD, e))?,
636            },
637            K::InvalidGasCoinUsage => Self::InvalidGasCoinUsage,
638            K::InvalidValueUsage => Self::InvalidValueUsage,
639            K::InvalidObjectByValue => Self::InvalidObjectByValue,
640            K::InvalidObjectByMutRef => Self::InvalidObjectByMutRef,
641            K::ConsensusObjectOperationNotAllowed => Self::ConsensusObjectOperationNotAllowed,
642            K::InvalidArgumentArity => Self::InvalidArgumentArity,
643            K::InvalidTransferObject => Self::InvalidTransferObject,
644            K::InvalidMakeMoveVecNonObjectArgument => Self::InvalidMakeMoveVecNonObjectArgument,
645            K::ArgumentWithoutValue => Self::ArgumentWithoutValue,
646            K::CannotMoveBorrowedValue => Self::CannotMoveBorrowedValue,
647            K::CannotWriteToExtendedReference => Self::CannotWriteToExtendedReference,
648            K::InvalidReferenceArgument => Self::InvalidReferenceArgument,
649        }
650        .pipe(Ok)
651    }
652}
653
654//
655// TypeArgumentError
656//
657
658impl From<sui_sdk_types::TypeArgumentError> for type_argument_error::TypeArgumentErrorKind {
659    fn from(value: sui_sdk_types::TypeArgumentError) -> Self {
660        use sui_sdk_types::TypeArgumentError::*;
661
662        match value {
663            TypeNotFound => Self::TypeNotFound,
664            ConstraintNotSatisfied => Self::ConstraintNotSatisfied,
665            _ => Self::Unknown,
666        }
667    }
668}
669
670impl TryFrom<type_argument_error::TypeArgumentErrorKind> for sui_sdk_types::TypeArgumentError {
671    type Error = TryFromProtoError;
672
673    fn try_from(value: type_argument_error::TypeArgumentErrorKind) -> Result<Self, Self::Error> {
674        use type_argument_error::TypeArgumentErrorKind as K;
675
676        match value {
677            K::Unknown => {
678                return Err(TryFromProtoError::invalid(
679                    "kind",
680                    "unknown TypeArgumentErrorKind",
681                ));
682            }
683            K::TypeNotFound => Self::TypeNotFound,
684            K::ConstraintNotSatisfied => Self::ConstraintNotSatisfied,
685        }
686        .pipe(Ok)
687    }
688}
689
690//
691// PackageUpgradeError
692//
693
694impl From<sui_sdk_types::PackageUpgradeError> for PackageUpgradeError {
695    fn from(value: sui_sdk_types::PackageUpgradeError) -> Self {
696        use package_upgrade_error::PackageUpgradeErrorKind;
697        use sui_sdk_types::PackageUpgradeError as E;
698
699        let mut message = Self::default();
700
701        let kind = match value {
702            E::UnableToFetchPackage { package_id } => {
703                message.package_id = Some(package_id.to_string());
704                PackageUpgradeErrorKind::UnableToFetchPackage
705            }
706            E::NotAPackage { object_id } => {
707                message.package_id = Some(object_id.to_string());
708                PackageUpgradeErrorKind::NotAPackage
709            }
710            E::IncompatibleUpgrade => PackageUpgradeErrorKind::IncompatibleUpgrade,
711            E::DigestDoesNotMatch { digest } => {
712                message.digest = Some(digest.to_string());
713                PackageUpgradeErrorKind::DigestDoesNotMatch
714            }
715            E::UnknownUpgradePolicy { policy } => {
716                message.policy = Some(policy.into());
717                PackageUpgradeErrorKind::UnknownUpgradePolicy
718            }
719            E::PackageIdDoesNotMatch {
720                package_id,
721                ticket_id,
722            } => {
723                message.package_id = Some(package_id.to_string());
724                message.ticket_id = Some(ticket_id.to_string());
725                PackageUpgradeErrorKind::PackageIdDoesNotMatch
726            }
727            _ => PackageUpgradeErrorKind::Unknown,
728        };
729
730        message.set_kind(kind);
731        message
732    }
733}
734
735impl TryFrom<&PackageUpgradeError> for sui_sdk_types::PackageUpgradeError {
736    type Error = TryFromProtoError;
737
738    fn try_from(value: &PackageUpgradeError) -> Result<Self, Self::Error> {
739        use package_upgrade_error::PackageUpgradeErrorKind as K;
740
741        match value.kind() {
742            K::Unknown => {
743                return Err(TryFromProtoError::invalid(
744                    PackageUpgradeError::KIND_FIELD,
745                    "unknown PackageUpgradeErrorKind",
746                ));
747            }
748            K::UnableToFetchPackage => Self::UnableToFetchPackage {
749                package_id: value
750                    .package_id
751                    .as_ref()
752                    .ok_or_else(|| TryFromProtoError::missing("package_id"))?
753                    .parse()
754                    .map_err(|e| {
755                        TryFromProtoError::invalid(PackageUpgradeError::PACKAGE_ID_FIELD, e)
756                    })?,
757            },
758            K::NotAPackage => Self::NotAPackage {
759                object_id: value
760                    .package_id
761                    .as_ref()
762                    .ok_or_else(|| TryFromProtoError::missing("package_id"))?
763                    .parse()
764                    .map_err(|e| {
765                        TryFromProtoError::invalid(PackageUpgradeError::PACKAGE_ID_FIELD, e)
766                    })?,
767            },
768            K::IncompatibleUpgrade => Self::IncompatibleUpgrade,
769            K::DigestDoesNotMatch => Self::DigestDoesNotMatch {
770                digest: value
771                    .digest
772                    .as_ref()
773                    .ok_or_else(|| TryFromProtoError::missing("digest"))?
774                    .parse()
775                    .map_err(|e| {
776                        TryFromProtoError::invalid(PackageUpgradeError::DIGEST_FIELD, e)
777                    })?,
778            },
779            K::UnknownUpgradePolicy => Self::UnknownUpgradePolicy {
780                policy: value
781                    .policy
782                    .ok_or_else(|| TryFromProtoError::missing("policy"))?
783                    .try_into()
784                    .map_err(|e| {
785                        TryFromProtoError::invalid(PackageUpgradeError::POLICY_FIELD, e)
786                    })?,
787            },
788            K::PackageIdDoesNotMatch => Self::PackageIdDoesNotMatch {
789                package_id: value
790                    .package_id
791                    .as_ref()
792                    .ok_or_else(|| TryFromProtoError::missing("package_id"))?
793                    .parse()
794                    .map_err(|e| {
795                        TryFromProtoError::invalid(PackageUpgradeError::PACKAGE_ID_FIELD, e)
796                    })?,
797                ticket_id: value
798                    .ticket_id
799                    .as_ref()
800                    .ok_or_else(|| TryFromProtoError::missing("ticket_id"))?
801                    .parse()
802                    .map_err(|e| {
803                        TryFromProtoError::invalid(PackageUpgradeError::TICKET_ID_FIELD, e)
804                    })?,
805            },
806        }
807        .pipe(Ok)
808    }
809}
810
811//
812// MoveLocation
813//
814
815impl From<sui_sdk_types::MoveLocation> for MoveLocation {
816    fn from(value: sui_sdk_types::MoveLocation) -> Self {
817        Self {
818            package: Some(value.package.to_string()),
819            module: Some(value.module.to_string()),
820            function: Some(value.function.into()),
821            instruction: Some(value.instruction.into()),
822            function_name: value.function_name.map(|name| name.to_string()),
823        }
824    }
825}
826
827impl TryFrom<&MoveLocation> for sui_sdk_types::MoveLocation {
828    type Error = TryFromProtoError;
829
830    fn try_from(value: &MoveLocation) -> Result<Self, Self::Error> {
831        let package = value
832            .package
833            .as_ref()
834            .ok_or_else(|| TryFromProtoError::missing("package"))?
835            .parse()
836            .map_err(|e| TryFromProtoError::invalid(MoveLocation::PACKAGE_FIELD, e))?;
837        let module = value
838            .module
839            .as_ref()
840            .ok_or_else(|| TryFromProtoError::missing("module"))?
841            .parse()
842            .map_err(|e| TryFromProtoError::invalid(MoveLocation::MODULE_FIELD, e))?;
843        let function = value
844            .function
845            .ok_or_else(|| TryFromProtoError::missing("function"))?
846            .try_into()
847            .map_err(|e| TryFromProtoError::invalid(MoveLocation::FUNCTION_FIELD, e))?;
848        let instruction = value
849            .instruction
850            .ok_or_else(|| TryFromProtoError::missing("instruction"))?
851            .try_into()
852            .map_err(|e| TryFromProtoError::invalid(MoveLocation::INSTRUCTION_FIELD, e))?;
853        let function_name = value
854            .function_name
855            .as_ref()
856            .map(|name| {
857                name.parse()
858                    .map_err(|e| TryFromProtoError::invalid(MoveLocation::FUNCTION_NAME_FIELD, e))
859            })
860            .transpose()?;
861
862        Ok(Self {
863            package,
864            module,
865            function,
866            instruction,
867            function_name,
868        })
869    }
870}