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