sui_rpc/proto/sui/rpc/v2/
execution_status.rs1use super::*;
2use crate::proto::TryFromProtoError;
3use tap::Pipe;
4
5impl From<sui_sdk_types::ExecutionStatus> for ExecutionStatus {
10 fn from(value: sui_sdk_types::ExecutionStatus) -> Self {
11 match value {
12 sui_sdk_types::ExecutionStatus::Success => Self {
13 success: Some(true),
14 error: None,
15 },
16 sui_sdk_types::ExecutionStatus::Failure { error, command } => {
17 let mut error_message = ExecutionError::from(error);
18 error_message.command = command;
19 Self {
20 success: Some(false),
21 error: Some(error_message),
22 }
23 }
24 }
25 }
26}
27
28impl TryFrom<&ExecutionStatus> for sui_sdk_types::ExecutionStatus {
29 type Error = TryFromProtoError;
30
31 fn try_from(value: &ExecutionStatus) -> Result<Self, Self::Error> {
32 let success = value
33 .success
34 .ok_or_else(|| TryFromProtoError::missing(ExecutionStatus::SUCCESS_FIELD))?;
35 match (success, &value.error) {
36 (true, None) => Self::Success,
37 (false, Some(error)) => Self::Failure {
38 error: sui_sdk_types::ExecutionError::try_from(error)
39 .map_err(|e| e.nested(ExecutionStatus::ERROR_FIELD))?,
40 command: error.command,
41 },
42 (true, Some(_)) | (false, None) => {
43 return Err(TryFromProtoError::invalid(
44 ExecutionStatus::ERROR_FIELD,
45 "invalid execution status",
46 ));
47 }
48 }
49 .pipe(Ok)
50 }
51}
52
53impl From<sui_sdk_types::ExecutionError> for ExecutionError {
58 fn from(value: sui_sdk_types::ExecutionError) -> Self {
59 use execution_error::ErrorDetails;
60 use execution_error::ExecutionErrorKind;
61 use sui_sdk_types::ExecutionError as E;
62
63 let mut message = Self::default();
64
65 let kind = match value {
66 E::InsufficientGas => ExecutionErrorKind::InsufficientGas,
67 E::InvalidGasObject => ExecutionErrorKind::InvalidGasObject,
68 E::InvariantViolation => ExecutionErrorKind::InvariantViolation,
69 E::FeatureNotYetSupported => ExecutionErrorKind::FeatureNotYetSupported,
70 E::ObjectTooBig {
71 object_size,
72 max_object_size,
73 } => {
74 message.error_details = Some(ErrorDetails::SizeError(SizeError {
75 size: Some(object_size),
76 max_size: Some(max_object_size),
77 }));
78 ExecutionErrorKind::ObjectTooBig
79 }
80 E::PackageTooBig {
81 object_size,
82 max_object_size,
83 } => {
84 message.error_details = Some(ErrorDetails::SizeError(SizeError {
85 size: Some(object_size),
86 max_size: Some(max_object_size),
87 }));
88 ExecutionErrorKind::PackageTooBig
89 }
90 E::CircularObjectOwnership { object } => {
91 message.error_details = Some(ErrorDetails::ObjectId(object.to_string()));
92 ExecutionErrorKind::CircularObjectOwnership
93 }
94 E::InsufficientCoinBalance => ExecutionErrorKind::InsufficientCoinBalance,
95 E::CoinBalanceOverflow => ExecutionErrorKind::CoinBalanceOverflow,
96 E::PublishErrorNonZeroAddress => ExecutionErrorKind::PublishErrorNonZeroAddress,
97 E::SuiMoveVerificationError => ExecutionErrorKind::SuiMoveVerificationError,
98 E::MovePrimitiveRuntimeError { location } => {
99 message.error_details = location.map(|l| {
100 ErrorDetails::Abort(MoveAbort {
101 location: Some(l.into()),
102 ..Default::default()
103 })
104 });
105 ExecutionErrorKind::MovePrimitiveRuntimeError
106 }
107 E::MoveAbort { location, code } => {
108 message.error_details = Some(ErrorDetails::Abort(MoveAbort {
109 abort_code: Some(code),
110 location: Some(location.into()),
111 clever_error: None,
112 }));
113 ExecutionErrorKind::MoveAbort
114 }
115 E::VmVerificationOrDeserializationError => {
116 ExecutionErrorKind::VmVerificationOrDeserializationError
117 }
118 E::VmInvariantViolation => ExecutionErrorKind::VmInvariantViolation,
119 E::FunctionNotFound => ExecutionErrorKind::FunctionNotFound,
120 E::ArityMismatch => ExecutionErrorKind::ArityMismatch,
121 E::TypeArityMismatch => ExecutionErrorKind::TypeArityMismatch,
122 E::NonEntryFunctionInvoked => ExecutionErrorKind::NonEntryFunctionInvoked,
123 E::CommandArgumentError { argument, kind } => {
124 let mut command_argument_error = CommandArgumentError::from(kind);
125 command_argument_error.argument = Some(argument.into());
126 message.error_details =
127 Some(ErrorDetails::CommandArgumentError(command_argument_error));
128 ExecutionErrorKind::CommandArgumentError
129 }
130 E::TypeArgumentError {
131 type_argument,
132 kind,
133 } => {
134 let type_argument_error = TypeArgumentError {
135 type_argument: Some(type_argument.into()),
136 kind: Some(type_argument_error::TypeArgumentErrorKind::from(kind).into()),
137 };
138 message.error_details = Some(ErrorDetails::TypeArgumentError(type_argument_error));
139 ExecutionErrorKind::TypeArgumentError
140 }
141 E::UnusedValueWithoutDrop { result, subresult } => {
142 message.error_details = Some(ErrorDetails::IndexError(IndexError {
143 index: Some(result.into()),
144 subresult: Some(subresult.into()),
145 }));
146 ExecutionErrorKind::UnusedValueWithoutDrop
147 }
148 E::InvalidPublicFunctionReturnType { index } => {
149 message.error_details = Some(ErrorDetails::IndexError(IndexError {
150 index: Some(index.into()),
151 subresult: None,
152 }));
153 ExecutionErrorKind::InvalidPublicFunctionReturnType
154 }
155 E::InvalidTransferObject => ExecutionErrorKind::InvalidTransferObject,
156 E::EffectsTooLarge {
157 current_size,
158 max_size,
159 } => {
160 message.error_details = Some(ErrorDetails::SizeError(SizeError {
161 size: Some(current_size),
162 max_size: Some(max_size),
163 }));
164 ExecutionErrorKind::EffectsTooLarge
165 }
166 E::PublishUpgradeMissingDependency => {
167 ExecutionErrorKind::PublishUpgradeMissingDependency
168 }
169 E::PublishUpgradeDependencyDowngrade => {
170 ExecutionErrorKind::PublishUpgradeDependencyDowngrade
171 }
172 E::PackageUpgradeError { kind } => {
173 message.error_details = Some(ErrorDetails::PackageUpgradeError(kind.into()));
174 ExecutionErrorKind::PackageUpgradeError
175 }
176 E::WrittenObjectsTooLarge {
177 object_size,
178 max_object_size,
179 } => {
180 message.error_details = Some(ErrorDetails::SizeError(SizeError {
181 size: Some(object_size),
182 max_size: Some(max_object_size),
183 }));
184
185 ExecutionErrorKind::WrittenObjectsTooLarge
186 }
187 E::CertificateDenied => ExecutionErrorKind::CertificateDenied,
188 E::SuiMoveVerificationTimedout => ExecutionErrorKind::SuiMoveVerificationTimedout,
189 E::ConsensusObjectOperationNotAllowed => {
190 ExecutionErrorKind::ConsensusObjectOperationNotAllowed
191 }
192 E::InputObjectDeleted => ExecutionErrorKind::InputObjectDeleted,
193 E::ExecutionCanceledDueToConsensusObjectCongestion { congested_objects } => {
194 message.error_details = Some(ErrorDetails::CongestedObjects(CongestedObjects {
195 objects: congested_objects.iter().map(ToString::to_string).collect(),
196 }));
197
198 ExecutionErrorKind::ExecutionCanceledDueToConsensusObjectCongestion
199 }
200 E::AddressDeniedForCoin { address, coin_type } => {
201 message.error_details = Some(ErrorDetails::CoinDenyListError(CoinDenyListError {
202 address: Some(address.to_string()),
203 coin_type: Some(coin_type),
204 }));
205 ExecutionErrorKind::AddressDeniedForCoin
206 }
207 E::CoinTypeGlobalPause { coin_type } => {
208 message.error_details = Some(ErrorDetails::CoinDenyListError(CoinDenyListError {
209 address: None,
210 coin_type: Some(coin_type),
211 }));
212 ExecutionErrorKind::CoinTypeGlobalPause
213 }
214 E::ExecutionCanceledDueToRandomnessUnavailable => {
215 ExecutionErrorKind::ExecutionCanceledDueToRandomnessUnavailable
216 }
217 E::MoveVectorElemTooBig {
218 value_size,
219 max_scaled_size,
220 } => {
221 message.error_details = Some(ErrorDetails::SizeError(SizeError {
222 size: Some(value_size),
223 max_size: Some(max_scaled_size),
224 }));
225
226 ExecutionErrorKind::MoveVectorElemTooBig
227 }
228 E::MoveRawValueTooBig {
229 value_size,
230 max_scaled_size,
231 } => {
232 message.error_details = Some(ErrorDetails::SizeError(SizeError {
233 size: Some(value_size),
234 max_size: Some(max_scaled_size),
235 }));
236 ExecutionErrorKind::MoveRawValueTooBig
237 }
238 E::InvalidLinkage => ExecutionErrorKind::InvalidLinkage,
239 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
520impl 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
654impl 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
690impl 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
811impl 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}