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