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