sui_rpc/proto/sui/rpc/v2/
execution_status.rs1use super::*;
2use crate::proto::TryFromProtoError;
3use tap::Pipe;
4
5impl ::prost::Name for ExecutionError {
6 const NAME: &'static str = "ExecutionError";
7 const PACKAGE: &'static str = "sui.rpc.v2";
8 fn full_name() -> ::prost::alloc::string::String {
9 "sui.rpc.v2.ExecutionError".into()
10 }
11 fn type_url() -> ::prost::alloc::string::String {
12 "/sui.rpc.v2.ExecutionError".into()
13 }
14}
15
16impl From<sui_sdk_types::ExecutionStatus> for ExecutionStatus {
21 fn from(value: sui_sdk_types::ExecutionStatus) -> Self {
22 match value {
23 sui_sdk_types::ExecutionStatus::Success => Self {
24 success: Some(true),
25 error: None,
26 },
27 sui_sdk_types::ExecutionStatus::Failure { error, command } => {
28 let mut error_message = ExecutionError::from(error);
29 error_message.command = command;
30 Self {
31 success: Some(false),
32 error: Some(error_message),
33 }
34 }
35 }
36 }
37}
38
39impl TryFrom<&ExecutionStatus> for sui_sdk_types::ExecutionStatus {
40 type Error = TryFromProtoError;
41
42 fn try_from(value: &ExecutionStatus) -> Result<Self, Self::Error> {
43 let success = value
44 .success
45 .ok_or_else(|| TryFromProtoError::missing(ExecutionStatus::SUCCESS_FIELD))?;
46 match (success, &value.error) {
47 (true, None) => Self::Success,
48 (false, Some(error)) => Self::Failure {
49 error: sui_sdk_types::ExecutionError::try_from(error)
50 .map_err(|e| e.nested(ExecutionStatus::ERROR_FIELD))?,
51 command: error.command,
52 },
53 (true, Some(_)) | (false, None) => {
54 return Err(TryFromProtoError::invalid(
55 ExecutionStatus::ERROR_FIELD,
56 "invalid execution status",
57 ));
58 }
59 }
60 .pipe(Ok)
61 }
62}
63
64impl From<sui_sdk_types::ExecutionError> for ExecutionError {
69 fn from(value: sui_sdk_types::ExecutionError) -> Self {
70 use execution_error::ErrorDetails;
71 use execution_error::ExecutionErrorKind;
72 use sui_sdk_types::ExecutionError as E;
73
74 let mut message = Self::default();
75
76 let kind = match value {
77 E::InsufficientGas => ExecutionErrorKind::InsufficientGas,
78 E::InvalidGasObject => ExecutionErrorKind::InvalidGasObject,
79 E::InvariantViolation => ExecutionErrorKind::InvariantViolation,
80 E::FeatureNotYetSupported => ExecutionErrorKind::FeatureNotYetSupported,
81 E::ObjectTooBig {
82 object_size,
83 max_object_size,
84 } => {
85 message.error_details = Some(ErrorDetails::SizeError(SizeError {
86 size: Some(object_size),
87 max_size: Some(max_object_size),
88 }));
89 ExecutionErrorKind::ObjectTooBig
90 }
91 E::PackageTooBig {
92 object_size,
93 max_object_size,
94 } => {
95 message.error_details = Some(ErrorDetails::SizeError(SizeError {
96 size: Some(object_size),
97 max_size: Some(max_object_size),
98 }));
99 ExecutionErrorKind::PackageTooBig
100 }
101 E::CircularObjectOwnership { object } => {
102 message.error_details = Some(ErrorDetails::ObjectId(object.to_string()));
103 ExecutionErrorKind::CircularObjectOwnership
104 }
105 E::InsufficientCoinBalance => ExecutionErrorKind::InsufficientCoinBalance,
106 E::CoinBalanceOverflow => ExecutionErrorKind::CoinBalanceOverflow,
107 E::PublishErrorNonZeroAddress => ExecutionErrorKind::PublishErrorNonZeroAddress,
108 E::SuiMoveVerificationError => ExecutionErrorKind::SuiMoveVerificationError,
109 E::MovePrimitiveRuntimeError { location } => {
110 message.error_details = location.map(|l| {
111 ErrorDetails::Abort(MoveAbort {
112 location: Some(l.into()),
113 ..Default::default()
114 })
115 });
116 ExecutionErrorKind::MovePrimitiveRuntimeError
117 }
118 E::MoveAbort { location, code } => {
119 message.error_details = Some(ErrorDetails::Abort(MoveAbort {
120 abort_code: Some(code),
121 location: Some(location.into()),
122 clever_error: None,
123 }));
124 ExecutionErrorKind::MoveAbort
125 }
126 E::VmVerificationOrDeserializationError => {
127 ExecutionErrorKind::VmVerificationOrDeserializationError
128 }
129 E::VmInvariantViolation => ExecutionErrorKind::VmInvariantViolation,
130 E::FunctionNotFound => ExecutionErrorKind::FunctionNotFound,
131 E::ArityMismatch => ExecutionErrorKind::ArityMismatch,
132 E::TypeArityMismatch => ExecutionErrorKind::TypeArityMismatch,
133 E::NonEntryFunctionInvoked => ExecutionErrorKind::NonEntryFunctionInvoked,
134 E::CommandArgumentError { argument, kind } => {
135 let mut command_argument_error = CommandArgumentError::from(kind);
136 command_argument_error.argument = Some(argument.into());
137 message.error_details =
138 Some(ErrorDetails::CommandArgumentError(command_argument_error));
139 ExecutionErrorKind::CommandArgumentError
140 }
141 E::TypeArgumentError {
142 type_argument,
143 kind,
144 } => {
145 let type_argument_error = TypeArgumentError {
146 type_argument: Some(type_argument.into()),
147 kind: Some(type_argument_error::TypeArgumentErrorKind::from(kind).into()),
148 };
149 message.error_details = Some(ErrorDetails::TypeArgumentError(type_argument_error));
150 ExecutionErrorKind::TypeArgumentError
151 }
152 E::UnusedValueWithoutDrop { result, subresult } => {
153 message.error_details = Some(ErrorDetails::IndexError(IndexError {
154 index: Some(result.into()),
155 subresult: Some(subresult.into()),
156 }));
157 ExecutionErrorKind::UnusedValueWithoutDrop
158 }
159 E::InvalidPublicFunctionReturnType { index } => {
160 message.error_details = Some(ErrorDetails::IndexError(IndexError {
161 index: Some(index.into()),
162 subresult: None,
163 }));
164 ExecutionErrorKind::InvalidPublicFunctionReturnType
165 }
166 E::InvalidTransferObject => ExecutionErrorKind::InvalidTransferObject,
167 E::EffectsTooLarge {
168 current_size,
169 max_size,
170 } => {
171 message.error_details = Some(ErrorDetails::SizeError(SizeError {
172 size: Some(current_size),
173 max_size: Some(max_size),
174 }));
175 ExecutionErrorKind::EffectsTooLarge
176 }
177 E::PublishUpgradeMissingDependency => {
178 ExecutionErrorKind::PublishUpgradeMissingDependency
179 }
180 E::PublishUpgradeDependencyDowngrade => {
181 ExecutionErrorKind::PublishUpgradeDependencyDowngrade
182 }
183 E::PackageUpgradeError { kind } => {
184 message.error_details = Some(ErrorDetails::PackageUpgradeError(kind.into()));
185 ExecutionErrorKind::PackageUpgradeError
186 }
187 E::WrittenObjectsTooLarge {
188 object_size,
189 max_object_size,
190 } => {
191 message.error_details = Some(ErrorDetails::SizeError(SizeError {
192 size: Some(object_size),
193 max_size: Some(max_object_size),
194 }));
195
196 ExecutionErrorKind::WrittenObjectsTooLarge
197 }
198 E::CertificateDenied => ExecutionErrorKind::CertificateDenied,
199 E::SuiMoveVerificationTimedout => ExecutionErrorKind::SuiMoveVerificationTimedout,
200 E::ConsensusObjectOperationNotAllowed => {
201 ExecutionErrorKind::ConsensusObjectOperationNotAllowed
202 }
203 E::InputObjectDeleted => ExecutionErrorKind::InputObjectDeleted,
204 E::ExecutionCanceledDueToConsensusObjectCongestion { congested_objects } => {
205 message.error_details = Some(ErrorDetails::CongestedObjects(CongestedObjects {
206 objects: congested_objects.iter().map(ToString::to_string).collect(),
207 }));
208
209 ExecutionErrorKind::ExecutionCanceledDueToConsensusObjectCongestion
210 }
211 E::AddressDeniedForCoin { address, coin_type } => {
212 message.error_details = Some(ErrorDetails::CoinDenyListError(CoinDenyListError {
213 address: Some(address.to_string()),
214 coin_type: Some(coin_type),
215 }));
216 ExecutionErrorKind::AddressDeniedForCoin
217 }
218 E::CoinTypeGlobalPause { coin_type } => {
219 message.error_details = Some(ErrorDetails::CoinDenyListError(CoinDenyListError {
220 address: None,
221 coin_type: Some(coin_type),
222 }));
223 ExecutionErrorKind::CoinTypeGlobalPause
224 }
225 E::ExecutionCanceledDueToRandomnessUnavailable => {
226 ExecutionErrorKind::ExecutionCanceledDueToRandomnessUnavailable
227 }
228 E::MoveVectorElemTooBig {
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
237 ExecutionErrorKind::MoveVectorElemTooBig
238 }
239 E::MoveRawValueTooBig {
240 value_size,
241 max_scaled_size,
242 } => {
243 message.error_details = Some(ErrorDetails::SizeError(SizeError {
244 size: Some(value_size),
245 max_size: Some(max_scaled_size),
246 }));
247 ExecutionErrorKind::MoveRawValueTooBig
248 }
249 E::InvalidLinkage => ExecutionErrorKind::InvalidLinkage,
250 E::InsufficientFundsForWithdraw => ExecutionErrorKind::InsufficientFundsForWithdraw,
251 E::NonExclusiveWriteInputObjectModified { object } => {
252 message.set_object_id(object);
253 ExecutionErrorKind::NonExclusiveWriteInputObjectModified
254 }
255 _ => ExecutionErrorKind::Unknown,
256 };
257
258 message.set_kind(kind);
259 message
260 }
261}
262
263impl TryFrom<&ExecutionError> for sui_sdk_types::ExecutionError {
264 type Error = TryFromProtoError;
265
266 fn try_from(value: &ExecutionError) -> Result<Self, Self::Error> {
267 use execution_error::ErrorDetails;
268 use execution_error::ExecutionErrorKind as K;
269
270 match value.kind() {
271 K::Unknown => return Err(TryFromProtoError::invalid(ExecutionError::KIND_FIELD, "unknown ExecutionErrorKind")),
272 K::InsufficientGas => Self::InsufficientGas,
273 K::InvalidGasObject => Self::InvalidGasObject,
274 K::InvariantViolation => Self::InvariantViolation,
275 K::FeatureNotYetSupported => Self::FeatureNotYetSupported,
276 K::ObjectTooBig => {
277 let Some(ErrorDetails::SizeError(SizeError { size, max_size })) =
278 &value.error_details
279 else {
280 return Err(TryFromProtoError::missing(ExecutionError::SIZE_ERROR_FIELD));
281 };
282 Self::ObjectTooBig {
283 object_size: size.ok_or_else(|| TryFromProtoError::missing(SizeError::SIZE_FIELD))?,
284 max_object_size: max_size
285 .ok_or_else(|| TryFromProtoError::missing(SizeError::MAX_SIZE_FIELD))?,
286 }
287 }
288 K::PackageTooBig => {
289 let Some(ErrorDetails::SizeError(SizeError { size, max_size })) =
290 &value.error_details
291 else {
292 return Err(TryFromProtoError::missing(ExecutionError::SIZE_ERROR_FIELD));
293 };
294 Self::PackageTooBig {
295 object_size: size.ok_or_else(|| TryFromProtoError::missing(SizeError::SIZE_FIELD))?,
296 max_object_size: max_size
297 .ok_or_else(|| TryFromProtoError::missing(SizeError::MAX_SIZE_FIELD))?,
298 }
299 }
300 K::CircularObjectOwnership => {
301 let Some(ErrorDetails::ObjectId(object_id)) = &value.error_details else {
302 return Err(TryFromProtoError::missing(ExecutionError::OBJECT_ID_FIELD));
303 };
304 Self::CircularObjectOwnership {
305 object: object_id.parse().map_err(|e| TryFromProtoError::invalid(ExecutionError::OBJECT_ID_FIELD, e))?,
306 }
307 }
308 K::InsufficientCoinBalance => Self::InsufficientCoinBalance,
309 K::CoinBalanceOverflow => Self::CoinBalanceOverflow,
310 K::PublishErrorNonZeroAddress => Self::PublishErrorNonZeroAddress,
311 K::SuiMoveVerificationError => Self::SuiMoveVerificationError,
312 K::MovePrimitiveRuntimeError => {
313 let location = if let Some(ErrorDetails::Abort(abort)) = &value.error_details {
314 abort.location.as_ref().map(TryInto::try_into).transpose()?
315 } else {
316 None
317 };
318 Self::MovePrimitiveRuntimeError { location }
319 }
320 K::MoveAbort => {
321 let Some(ErrorDetails::Abort(abort)) = &value.error_details else {
322 return Err(TryFromProtoError::missing("abort"));
323 };
324 Self::MoveAbort {
325 location: abort
326 .location
327 .as_ref()
328 .ok_or_else(|| TryFromProtoError::missing("location"))?
329 .try_into()?,
330 code: abort
331 .abort_code
332 .ok_or_else(|| TryFromProtoError::missing("abort_code"))?,
333 }
334 }
335 K::VmVerificationOrDeserializationError => Self::VmVerificationOrDeserializationError,
336 K::VmInvariantViolation => Self::VmInvariantViolation,
337 K::FunctionNotFound => Self::FunctionNotFound,
338 K::ArityMismatch => Self::ArityMismatch,
339 K::TypeArityMismatch => Self::TypeArityMismatch,
340 K::NonEntryFunctionInvoked => Self::NonEntryFunctionInvoked,
341 K::CommandArgumentError => {
342 let Some(ErrorDetails::CommandArgumentError(command_argument_error)) =
343 &value.error_details
344 else {
345 return Err(TryFromProtoError::missing("command_argument_error"));
346 };
347 Self::CommandArgumentError {
348 argument: command_argument_error
349 .argument
350 .ok_or_else(|| TryFromProtoError::missing("argument"))?
351 .try_into()
352 .map_err(|e| TryFromProtoError::invalid(CommandArgumentError::ARGUMENT_FIELD, e))?,
353 kind: command_argument_error.try_into()?,
354 }
355 }
356 K::TypeArgumentError => {
357 let Some(ErrorDetails::TypeArgumentError(type_argument_error)) =
358 &value.error_details
359 else {
360 return Err(TryFromProtoError::missing("type_argument_error"));
361 };
362 Self::TypeArgumentError {
363 type_argument: type_argument_error
364 .type_argument
365 .ok_or_else(|| TryFromProtoError::missing("type_argument"))?
366 .try_into()
367 .map_err(|e| TryFromProtoError::invalid(TypeArgumentError::TYPE_ARGUMENT_FIELD, e))?,
368 kind: type_argument_error.kind().try_into()?,
369 }
370 }
371 K::UnusedValueWithoutDrop => {
372 let Some(ErrorDetails::IndexError(IndexError { index, subresult })) =
373 &value.error_details
374 else {
375 return Err(TryFromProtoError::missing("index_error"));
376 };
377 Self::UnusedValueWithoutDrop {
378 result: index
379 .ok_or_else(|| TryFromProtoError::missing("result"))?
380 .try_into()
381 .map_err(|e| TryFromProtoError::invalid(IndexError::INDEX_FIELD, e))?,
382 subresult: subresult
383 .ok_or_else(|| TryFromProtoError::missing("subresult"))?
384 .try_into()
385 .map_err(|e| TryFromProtoError::invalid(IndexError::SUBRESULT_FIELD, e))?,
386 }
387 }
388 K::InvalidPublicFunctionReturnType => {
389 let Some(ErrorDetails::IndexError(IndexError { index, .. })) =
390 &value.error_details
391 else {
392 return Err(TryFromProtoError::missing("index_error"));
393 };
394 Self::InvalidPublicFunctionReturnType {
395 index: index
396 .ok_or_else(|| TryFromProtoError::missing("index"))?
397 .try_into()
398 .map_err(|e| TryFromProtoError::invalid(IndexError::INDEX_FIELD, e))?,
399 }
400 }
401 K::InvalidTransferObject => Self::InvalidTransferObject,
402 K::EffectsTooLarge => {
403 let Some(ErrorDetails::SizeError(SizeError { size, max_size })) =
404 &value.error_details
405 else {
406 return Err(TryFromProtoError::missing(ExecutionError::SIZE_ERROR_FIELD));
407 };
408 Self::EffectsTooLarge {
409 current_size: size.ok_or_else(|| TryFromProtoError::missing(SizeError::SIZE_FIELD))?,
410 max_size: max_size.ok_or_else(|| TryFromProtoError::missing(SizeError::MAX_SIZE_FIELD))?,
411 }
412 }
413 K::PublishUpgradeMissingDependency => Self::PublishUpgradeMissingDependency,
414 K::PublishUpgradeDependencyDowngrade => Self::PublishUpgradeDependencyDowngrade,
415 K::PackageUpgradeError => {
416 let Some(ErrorDetails::PackageUpgradeError(package_upgrade_error)) =
417 &value.error_details
418 else {
419 return Err(TryFromProtoError::missing("package_upgrade_error"));
420 };
421 Self::PackageUpgradeError {
422 kind: package_upgrade_error.try_into()?,
423 }
424 }
425 K::WrittenObjectsTooLarge => {
426 let Some(ErrorDetails::SizeError(SizeError { size, max_size })) =
427 &value.error_details
428 else {
429 return Err(TryFromProtoError::missing(ExecutionError::SIZE_ERROR_FIELD));
430 };
431
432 Self::WrittenObjectsTooLarge {
433 object_size: size.ok_or_else(|| TryFromProtoError::missing(SizeError::SIZE_FIELD))?,
434 max_object_size: max_size
435 .ok_or_else(|| TryFromProtoError::missing(SizeError::MAX_SIZE_FIELD))?,
436 }
437 }
438 K::CertificateDenied => Self::CertificateDenied,
439 K::SuiMoveVerificationTimedout => Self::SuiMoveVerificationTimedout,
440 K::ConsensusObjectOperationNotAllowed => Self::ConsensusObjectOperationNotAllowed,
441 K::InputObjectDeleted => Self::InputObjectDeleted,
442 K::ExecutionCanceledDueToConsensusObjectCongestion => {
443 let Some(ErrorDetails::CongestedObjects(CongestedObjects { objects })) =
444 &value.error_details
445 else {
446 return Err(TryFromProtoError::missing("congested_objects"));
447 };
448
449 Self::ExecutionCanceledDueToConsensusObjectCongestion {
450 congested_objects: objects
451 .iter()
452 .map(|s| s.parse())
453 .collect::<Result<_, _>>()
454 .map_err(|e| TryFromProtoError::invalid(CongestedObjects::OBJECTS_FIELD, e))?,
455 }
456 }
457 K::AddressDeniedForCoin => {
458 let Some(ErrorDetails::CoinDenyListError(CoinDenyListError {
459 address,
460 coin_type,
461 })) = &value.error_details
462 else {
463 return Err(TryFromProtoError::missing("coin_deny_list_error"));
464 };
465 Self::AddressDeniedForCoin {
466 address: address
467 .as_ref()
468 .ok_or_else(|| TryFromProtoError::missing("address"))?
469 .parse()
470 .map_err(|e| TryFromProtoError::invalid(CoinDenyListError::ADDRESS_FIELD, e))?,
471 coin_type: coin_type
472 .as_ref()
473 .ok_or_else(|| TryFromProtoError::missing("coin_type"))?
474 .to_owned(),
475 }
476 }
477 K::CoinTypeGlobalPause => {
478 let Some(ErrorDetails::CoinDenyListError(CoinDenyListError {
479 coin_type,
480 ..
481 })) = &value.error_details
482 else {
483 return Err(TryFromProtoError::missing("coin_deny_list_error"));
484 };
485 Self::CoinTypeGlobalPause {
486 coin_type: coin_type
487 .as_ref()
488 .ok_or_else(|| TryFromProtoError::missing("coin_type"))?
489 .to_owned(),
490 }
491 }
492 K::ExecutionCanceledDueToRandomnessUnavailable => {
493 Self::ExecutionCanceledDueToRandomnessUnavailable
494 }
495 K::MoveVectorElemTooBig => {
496 let Some(ErrorDetails::SizeError(SizeError { size, max_size })) =
497 &value.error_details
498 else {
499 return Err(TryFromProtoError::missing(ExecutionError::SIZE_ERROR_FIELD));
500 };
501
502 Self::MoveVectorElemTooBig {
503 value_size: size.ok_or_else(|| TryFromProtoError::missing(SizeError::SIZE_FIELD))?,
504 max_scaled_size: max_size
505 .ok_or_else(|| TryFromProtoError::missing(SizeError::MAX_SIZE_FIELD))?,
506 }
507 }
508 K::MoveRawValueTooBig => {
509 let Some(ErrorDetails::SizeError(SizeError { size, max_size })) =
510 &value.error_details
511 else {
512 return Err(TryFromProtoError::missing(ExecutionError::SIZE_ERROR_FIELD));
513 };
514
515 Self::MoveRawValueTooBig {
516 value_size: size.ok_or_else(|| TryFromProtoError::missing(SizeError::SIZE_FIELD))?,
517 max_scaled_size: max_size
518 .ok_or_else(|| TryFromProtoError::missing(SizeError::MAX_SIZE_FIELD))?,
519 }
520 }
521 K::InvalidLinkage => Self::InvalidLinkage,
522 K::InsufficientFundsForWithdraw => Self::InsufficientFundsForWithdraw,
523 K::NonExclusiveWriteInputObjectModified => Self::NonExclusiveWriteInputObjectModified {
524 object: value.object_id().parse().map_err(|e| TryFromProtoError::invalid("object_id", e))?
525 },
526 }
527 .pipe(Ok)
528 }
529}
530
531impl From<sui_sdk_types::CommandArgumentError> for CommandArgumentError {
536 fn from(value: sui_sdk_types::CommandArgumentError) -> Self {
537 use command_argument_error::CommandArgumentErrorKind;
538 use sui_sdk_types::CommandArgumentError as E;
539
540 let mut message = Self::default();
541
542 let kind = match value {
543 E::TypeMismatch => CommandArgumentErrorKind::TypeMismatch,
544 E::InvalidBcsBytes => CommandArgumentErrorKind::InvalidBcsBytes,
545 E::InvalidUsageOfPureArgument => CommandArgumentErrorKind::InvalidUsageOfPureArgument,
546 E::InvalidArgumentToPrivateEntryFunction => {
547 CommandArgumentErrorKind::InvalidArgumentToPrivateEntryFunction
548 }
549 E::IndexOutOfBounds { index } => {
550 message.index_error = Some(IndexError {
551 index: Some(index.into()),
552 subresult: None,
553 });
554 CommandArgumentErrorKind::IndexOutOfBounds
555 }
556 E::SecondaryIndexOutOfBounds { result, subresult } => {
557 message.index_error = Some(IndexError {
558 index: Some(result.into()),
559 subresult: Some(subresult.into()),
560 });
561 CommandArgumentErrorKind::SecondaryIndexOutOfBounds
562 }
563 E::InvalidResultArity { result } => {
564 message.index_error = Some(IndexError {
565 index: Some(result.into()),
566 subresult: None,
567 });
568 CommandArgumentErrorKind::InvalidResultArity
569 }
570 E::InvalidGasCoinUsage => CommandArgumentErrorKind::InvalidGasCoinUsage,
571 E::InvalidValueUsage => CommandArgumentErrorKind::InvalidValueUsage,
572 E::InvalidObjectByValue => CommandArgumentErrorKind::InvalidObjectByValue,
573 E::InvalidObjectByMutRef => CommandArgumentErrorKind::InvalidObjectByMutRef,
574 E::ConsensusObjectOperationNotAllowed => {
575 CommandArgumentErrorKind::ConsensusObjectOperationNotAllowed
576 }
577 E::InvalidArgumentArity => CommandArgumentErrorKind::InvalidArgumentArity,
578 E::InvalidTransferObject => CommandArgumentErrorKind::InvalidTransferObject,
579 E::InvalidMakeMoveVecNonObjectArgument => {
580 CommandArgumentErrorKind::InvalidMakeMoveVecNonObjectArgument
581 }
582 E::ArgumentWithoutValue => CommandArgumentErrorKind::ArgumentWithoutValue,
583 E::CannotMoveBorrowedValue => CommandArgumentErrorKind::CannotMoveBorrowedValue,
584 E::CannotWriteToExtendedReference => {
585 CommandArgumentErrorKind::CannotWriteToExtendedReference
586 }
587 E::InvalidReferenceArgument => CommandArgumentErrorKind::InvalidReferenceArgument,
588 E::InvalidTxContext => CommandArgumentErrorKind::InvalidTxContext,
589 _ => CommandArgumentErrorKind::Unknown,
590 };
591
592 message.set_kind(kind);
593 message
594 }
595}
596
597impl TryFrom<&CommandArgumentError> for sui_sdk_types::CommandArgumentError {
598 type Error = TryFromProtoError;
599
600 fn try_from(value: &CommandArgumentError) -> Result<Self, Self::Error> {
601 use command_argument_error::CommandArgumentErrorKind as K;
602
603 match value.kind() {
604 K::Unknown => {
605 return Err(TryFromProtoError::invalid(
606 CommandArgumentError::KIND_FIELD,
607 "unknown CommandArgumentErrorKind",
608 ));
609 }
610 K::TypeMismatch => Self::TypeMismatch,
611 K::InvalidBcsBytes => Self::InvalidBcsBytes,
612 K::InvalidUsageOfPureArgument => Self::InvalidUsageOfPureArgument,
613 K::InvalidArgumentToPrivateEntryFunction => Self::InvalidArgumentToPrivateEntryFunction,
614 K::IndexOutOfBounds => Self::IndexOutOfBounds {
615 index: value
616 .index_error
617 .ok_or_else(|| TryFromProtoError::missing("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 },
623 K::SecondaryIndexOutOfBounds => {
624 let index_error = value
625 .index_error
626 .ok_or_else(|| TryFromProtoError::missing("index_error"))?;
627 Self::SecondaryIndexOutOfBounds {
628 result: index_error
629 .index
630 .ok_or_else(|| TryFromProtoError::missing("index"))?
631 .try_into()
632 .map_err(|e| TryFromProtoError::invalid(IndexError::INDEX_FIELD, e))?,
633 subresult: index_error
634 .subresult
635 .ok_or_else(|| TryFromProtoError::missing("subresult"))?
636 .try_into()
637 .map_err(|e| TryFromProtoError::invalid(IndexError::SUBRESULT_FIELD, e))?,
638 }
639 }
640 K::InvalidResultArity => Self::InvalidResultArity {
641 result: value
642 .index_error
643 .ok_or_else(|| TryFromProtoError::missing("index_error"))?
644 .index
645 .ok_or_else(|| TryFromProtoError::missing("index"))?
646 .try_into()
647 .map_err(|e| TryFromProtoError::invalid(IndexError::INDEX_FIELD, e))?,
648 },
649 K::InvalidGasCoinUsage => Self::InvalidGasCoinUsage,
650 K::InvalidValueUsage => Self::InvalidValueUsage,
651 K::InvalidObjectByValue => Self::InvalidObjectByValue,
652 K::InvalidObjectByMutRef => Self::InvalidObjectByMutRef,
653 K::ConsensusObjectOperationNotAllowed => Self::ConsensusObjectOperationNotAllowed,
654 K::InvalidArgumentArity => Self::InvalidArgumentArity,
655 K::InvalidTransferObject => Self::InvalidTransferObject,
656 K::InvalidMakeMoveVecNonObjectArgument => Self::InvalidMakeMoveVecNonObjectArgument,
657 K::ArgumentWithoutValue => Self::ArgumentWithoutValue,
658 K::CannotMoveBorrowedValue => Self::CannotMoveBorrowedValue,
659 K::CannotWriteToExtendedReference => Self::CannotWriteToExtendedReference,
660 K::InvalidReferenceArgument => Self::InvalidReferenceArgument,
661 K::InvalidTxContext => Self::InvalidTxContext,
662 }
663 .pipe(Ok)
664 }
665}
666
667impl From<sui_sdk_types::TypeArgumentError> for type_argument_error::TypeArgumentErrorKind {
672 fn from(value: sui_sdk_types::TypeArgumentError) -> Self {
673 use sui_sdk_types::TypeArgumentError::*;
674
675 match value {
676 TypeNotFound => Self::TypeNotFound,
677 ConstraintNotSatisfied => Self::ConstraintNotSatisfied,
678 _ => Self::Unknown,
679 }
680 }
681}
682
683impl TryFrom<type_argument_error::TypeArgumentErrorKind> for sui_sdk_types::TypeArgumentError {
684 type Error = TryFromProtoError;
685
686 fn try_from(value: type_argument_error::TypeArgumentErrorKind) -> Result<Self, Self::Error> {
687 use type_argument_error::TypeArgumentErrorKind as K;
688
689 match value {
690 K::Unknown => {
691 return Err(TryFromProtoError::invalid(
692 "kind",
693 "unknown TypeArgumentErrorKind",
694 ));
695 }
696 K::TypeNotFound => Self::TypeNotFound,
697 K::ConstraintNotSatisfied => Self::ConstraintNotSatisfied,
698 }
699 .pipe(Ok)
700 }
701}
702
703impl From<sui_sdk_types::PackageUpgradeError> for PackageUpgradeError {
708 fn from(value: sui_sdk_types::PackageUpgradeError) -> Self {
709 use package_upgrade_error::PackageUpgradeErrorKind;
710 use sui_sdk_types::PackageUpgradeError as E;
711
712 let mut message = Self::default();
713
714 let kind = match value {
715 E::UnableToFetchPackage { package_id } => {
716 message.package_id = Some(package_id.to_string());
717 PackageUpgradeErrorKind::UnableToFetchPackage
718 }
719 E::NotAPackage { object_id } => {
720 message.package_id = Some(object_id.to_string());
721 PackageUpgradeErrorKind::NotAPackage
722 }
723 E::IncompatibleUpgrade => PackageUpgradeErrorKind::IncompatibleUpgrade,
724 E::DigestDoesNotMatch { digest } => {
725 message.digest = Some(digest.to_string());
726 PackageUpgradeErrorKind::DigestDoesNotMatch
727 }
728 E::UnknownUpgradePolicy { policy } => {
729 message.policy = Some(policy.into());
730 PackageUpgradeErrorKind::UnknownUpgradePolicy
731 }
732 E::PackageIdDoesNotMatch {
733 package_id,
734 ticket_id,
735 } => {
736 message.package_id = Some(package_id.to_string());
737 message.ticket_id = Some(ticket_id.to_string());
738 PackageUpgradeErrorKind::PackageIdDoesNotMatch
739 }
740 _ => PackageUpgradeErrorKind::Unknown,
741 };
742
743 message.set_kind(kind);
744 message
745 }
746}
747
748impl TryFrom<&PackageUpgradeError> for sui_sdk_types::PackageUpgradeError {
749 type Error = TryFromProtoError;
750
751 fn try_from(value: &PackageUpgradeError) -> Result<Self, Self::Error> {
752 use package_upgrade_error::PackageUpgradeErrorKind as K;
753
754 match value.kind() {
755 K::Unknown => {
756 return Err(TryFromProtoError::invalid(
757 PackageUpgradeError::KIND_FIELD,
758 "unknown PackageUpgradeErrorKind",
759 ));
760 }
761 K::UnableToFetchPackage => Self::UnableToFetchPackage {
762 package_id: value
763 .package_id
764 .as_ref()
765 .ok_or_else(|| TryFromProtoError::missing("package_id"))?
766 .parse()
767 .map_err(|e| {
768 TryFromProtoError::invalid(PackageUpgradeError::PACKAGE_ID_FIELD, e)
769 })?,
770 },
771 K::NotAPackage => Self::NotAPackage {
772 object_id: value
773 .package_id
774 .as_ref()
775 .ok_or_else(|| TryFromProtoError::missing("package_id"))?
776 .parse()
777 .map_err(|e| {
778 TryFromProtoError::invalid(PackageUpgradeError::PACKAGE_ID_FIELD, e)
779 })?,
780 },
781 K::IncompatibleUpgrade => Self::IncompatibleUpgrade,
782 K::DigestDoesNotMatch => Self::DigestDoesNotMatch {
783 digest: value
784 .digest
785 .as_ref()
786 .ok_or_else(|| TryFromProtoError::missing("digest"))?
787 .parse()
788 .map_err(|e| {
789 TryFromProtoError::invalid(PackageUpgradeError::DIGEST_FIELD, e)
790 })?,
791 },
792 K::UnknownUpgradePolicy => Self::UnknownUpgradePolicy {
793 policy: value
794 .policy
795 .ok_or_else(|| TryFromProtoError::missing("policy"))?
796 .try_into()
797 .map_err(|e| {
798 TryFromProtoError::invalid(PackageUpgradeError::POLICY_FIELD, e)
799 })?,
800 },
801 K::PackageIdDoesNotMatch => Self::PackageIdDoesNotMatch {
802 package_id: value
803 .package_id
804 .as_ref()
805 .ok_or_else(|| TryFromProtoError::missing("package_id"))?
806 .parse()
807 .map_err(|e| {
808 TryFromProtoError::invalid(PackageUpgradeError::PACKAGE_ID_FIELD, e)
809 })?,
810 ticket_id: value
811 .ticket_id
812 .as_ref()
813 .ok_or_else(|| TryFromProtoError::missing("ticket_id"))?
814 .parse()
815 .map_err(|e| {
816 TryFromProtoError::invalid(PackageUpgradeError::TICKET_ID_FIELD, e)
817 })?,
818 },
819 }
820 .pipe(Ok)
821 }
822}
823
824impl From<sui_sdk_types::MoveLocation> for MoveLocation {
829 fn from(value: sui_sdk_types::MoveLocation) -> Self {
830 Self {
831 package: Some(value.package.to_string()),
832 module: Some(value.module.to_string()),
833 function: Some(value.function.into()),
834 instruction: Some(value.instruction.into()),
835 function_name: value.function_name.map(|name| name.to_string()),
836 }
837 }
838}
839
840impl TryFrom<&MoveLocation> for sui_sdk_types::MoveLocation {
841 type Error = TryFromProtoError;
842
843 fn try_from(value: &MoveLocation) -> Result<Self, Self::Error> {
844 let package = value
845 .package
846 .as_ref()
847 .ok_or_else(|| TryFromProtoError::missing("package"))?
848 .parse()
849 .map_err(|e| TryFromProtoError::invalid(MoveLocation::PACKAGE_FIELD, e))?;
850 let module = value
851 .module
852 .as_ref()
853 .ok_or_else(|| TryFromProtoError::missing("module"))?
854 .parse()
855 .map_err(|e| TryFromProtoError::invalid(MoveLocation::MODULE_FIELD, e))?;
856 let function = value
857 .function
858 .ok_or_else(|| TryFromProtoError::missing("function"))?
859 .try_into()
860 .map_err(|e| TryFromProtoError::invalid(MoveLocation::FUNCTION_FIELD, e))?;
861 let instruction = value
862 .instruction
863 .ok_or_else(|| TryFromProtoError::missing("instruction"))?
864 .try_into()
865 .map_err(|e| TryFromProtoError::invalid(MoveLocation::INSTRUCTION_FIELD, e))?;
866 let function_name = value
867 .function_name
868 .as_ref()
869 .map(|name| {
870 name.parse()
871 .map_err(|e| TryFromProtoError::invalid(MoveLocation::FUNCTION_NAME_FIELD, e))
872 })
873 .transpose()?;
874
875 Ok(Self {
876 package,
877 module,
878 function,
879 instruction,
880 function_name,
881 })
882 }
883}