1use super::*;
2use crate::field::FieldMaskTree;
3use crate::merge::Merge;
4use crate::proto::TryFromProtoError;
5use tap::Pipe;
6
7impl From<sui_sdk_types::Transaction> for Transaction {
12 fn from(value: sui_sdk_types::Transaction) -> Self {
13 Self::merge_from(value, &FieldMaskTree::new_wildcard())
14 }
15}
16
17impl Merge<sui_sdk_types::Transaction> for Transaction {
18 fn merge(&mut self, source: sui_sdk_types::Transaction, mask: &FieldMaskTree) {
19 if mask.contains(Self::BCS_FIELD.name) {
20 let mut bcs = Bcs::serialize(&source).unwrap();
21 bcs.name = Some("TransactionData".to_owned());
22 self.bcs = Some(bcs);
23 }
24
25 if mask.contains(Self::DIGEST_FIELD.name) {
26 self.digest = Some(source.digest().to_string());
27 }
28
29 if mask.contains(Self::VERSION_FIELD.name) {
30 self.version = Some(1);
31 }
32
33 if mask.contains(Self::KIND_FIELD.name) {
34 self.kind = Some(source.kind.into());
35 }
36
37 if mask.contains(Self::SENDER_FIELD.name) {
38 self.sender = Some(source.sender.to_string());
39 }
40
41 if mask.contains(Self::GAS_PAYMENT_FIELD.name) {
42 self.gas_payment = Some(source.gas_payment.into());
43 }
44
45 if mask.contains(Self::EXPIRATION_FIELD.name) {
46 self.expiration = Some(source.expiration.into());
47 }
48 }
49}
50
51impl Merge<&Transaction> for Transaction {
52 fn merge(&mut self, source: &Transaction, mask: &FieldMaskTree) {
53 let Transaction {
54 bcs,
55 digest,
56 version,
57 kind,
58 sender,
59 gas_payment,
60 expiration,
61 } = source;
62
63 if mask.contains(Self::BCS_FIELD.name) {
64 self.bcs = bcs.clone();
65 }
66
67 if mask.contains(Self::DIGEST_FIELD.name) {
68 self.digest = digest.clone();
69 }
70
71 if mask.contains(Self::VERSION_FIELD.name) {
72 self.version = *version;
73 }
74
75 if mask.contains(Self::KIND_FIELD.name) {
76 self.kind = kind.clone();
77 }
78
79 if mask.contains(Self::SENDER_FIELD.name) {
80 self.sender = sender.clone();
81 }
82
83 if mask.contains(Self::GAS_PAYMENT_FIELD.name) {
84 self.gas_payment = gas_payment.clone();
85 }
86
87 if mask.contains(Self::EXPIRATION_FIELD.name) {
88 self.expiration = expiration.clone();
89 }
90 }
91}
92
93impl TryFrom<&Transaction> for sui_sdk_types::Transaction {
94 type Error = TryFromProtoError;
95
96 fn try_from(value: &Transaction) -> Result<Self, Self::Error> {
97 if let Some(bcs) = &value.bcs {
98 return bcs
99 .deserialize()
100 .map_err(|e| TryFromProtoError::invalid(Transaction::BCS_FIELD, e));
101 }
102
103 match value.version {
104 Some(1) => {}
105 v => {
106 return Err(TryFromProtoError::invalid(
107 Transaction::VERSION_FIELD,
108 format!("unknown Transaction version {v:?}"),
109 ));
110 }
111 }
112
113 let kind = value
114 .kind
115 .as_ref()
116 .ok_or_else(|| TryFromProtoError::missing("kind"))?
117 .try_into()?;
118
119 let sender = value
120 .sender
121 .as_ref()
122 .ok_or_else(|| TryFromProtoError::missing("sender"))?
123 .parse()
124 .map_err(|e| TryFromProtoError::invalid(Transaction::SENDER_FIELD, e))?;
125
126 let gas_payment = value
127 .gas_payment
128 .as_ref()
129 .ok_or_else(|| TryFromProtoError::missing("gas_payment"))?
130 .try_into()?;
131
132 let expiration = value
133 .expiration
134 .as_ref()
135 .ok_or_else(|| TryFromProtoError::missing("expiration"))?
136 .try_into()?;
137
138 Ok(Self {
139 kind,
140 sender,
141 gas_payment,
142 expiration,
143 })
144 }
145}
146
147impl From<sui_sdk_types::GasPayment> for GasPayment {
152 fn from(value: sui_sdk_types::GasPayment) -> Self {
153 Self {
154 objects: value.objects.into_iter().map(Into::into).collect(),
155 owner: Some(value.owner.to_string()),
156 price: Some(value.price),
157 budget: Some(value.budget),
158 }
159 }
160}
161
162impl TryFrom<&GasPayment> for sui_sdk_types::GasPayment {
163 type Error = TryFromProtoError;
164
165 fn try_from(value: &GasPayment) -> Result<Self, Self::Error> {
166 let objects = value
167 .objects
168 .iter()
169 .map(TryInto::try_into)
170 .collect::<Result<_, _>>()?;
171
172 let owner = value
173 .owner
174 .as_ref()
175 .ok_or_else(|| TryFromProtoError::missing("owner"))?
176 .parse()
177 .map_err(|e| TryFromProtoError::invalid(GasPayment::OWNER_FIELD, e))?;
178 let price = value
179 .price
180 .ok_or_else(|| TryFromProtoError::missing("price"))?;
181 let budget = value
182 .budget
183 .ok_or_else(|| TryFromProtoError::missing("budget"))?;
184 Ok(Self {
185 objects,
186 owner,
187 price,
188 budget,
189 })
190 }
191}
192
193impl From<sui_sdk_types::TransactionExpiration> for TransactionExpiration {
198 fn from(value: sui_sdk_types::TransactionExpiration) -> Self {
199 use sui_sdk_types::TransactionExpiration::*;
200 use transaction_expiration::TransactionExpirationKind;
201
202 let mut message = Self::default();
203
204 let kind = match value {
205 None => TransactionExpirationKind::None,
206 Epoch(epoch) => {
207 message.epoch = Some(epoch);
208 TransactionExpirationKind::Epoch
209 }
210 ValidDuring {
211 min_epoch,
212 max_epoch,
213 min_timestamp,
214 max_timestamp,
215 chain,
216 nonce,
217 } => {
218 message.epoch = max_epoch;
219 message.min_epoch = min_epoch;
220 message.set_chain(chain);
221 message.set_nonce(nonce);
222 message.min_timestamp = min_timestamp.map(|seconds| prost_types::Timestamp {
223 seconds: seconds as _,
224 nanos: 0,
225 });
226 message.max_timestamp = max_timestamp.map(|seconds| prost_types::Timestamp {
227 seconds: seconds as _,
228 nanos: 0,
229 });
230 TransactionExpirationKind::ValidDuring
231 }
232 _ => TransactionExpirationKind::Unknown,
233 };
234
235 message.set_kind(kind);
236 message
237 }
238}
239
240impl TryFrom<&TransactionExpiration> for sui_sdk_types::TransactionExpiration {
241 type Error = TryFromProtoError;
242
243 fn try_from(value: &TransactionExpiration) -> Result<Self, Self::Error> {
244 use transaction_expiration::TransactionExpirationKind;
245
246 match value.kind() {
247 TransactionExpirationKind::Unknown => {
248 return Err(TryFromProtoError::invalid(
249 TransactionExpiration::KIND_FIELD,
250 "unknown TransactionExpirationKind",
251 ));
252 }
253 TransactionExpirationKind::None => Self::None,
254 TransactionExpirationKind::Epoch => Self::Epoch(value.epoch()),
255 TransactionExpirationKind::ValidDuring => Self::ValidDuring {
256 min_epoch: value.min_epoch_opt(),
257 max_epoch: value.epoch_opt(),
258 min_timestamp: value
259 .min_timestamp_opt()
260 .map(|timestamp| timestamp.seconds as _),
261 max_timestamp: value
262 .max_timestamp_opt()
263 .map(|timestamp| timestamp.seconds as _),
264 chain: value
265 .chain_opt()
266 .ok_or_else(|| TryFromProtoError::missing("chain"))?
267 .parse()
268 .map_err(|e| TryFromProtoError::invalid("chain", e))?,
269 nonce: value
270 .nonce_opt()
271 .ok_or_else(|| TryFromProtoError::missing("nonce"))?,
272 },
273 }
274 .pipe(Ok)
275 }
276}
277
278impl From<ProgrammableTransaction> for TransactionKind {
283 fn from(value: ProgrammableTransaction) -> Self {
284 Self::default()
285 .with_programmable_transaction(value)
286 .with_kind(transaction_kind::Kind::ProgrammableTransaction)
287 }
288}
289
290impl From<sui_sdk_types::TransactionKind> for TransactionKind {
291 fn from(value: sui_sdk_types::TransactionKind) -> Self {
292 use sui_sdk_types::TransactionKind as K;
293 use transaction_kind::Kind;
294
295 let message = Self::default();
296
297 match value {
298 K::ProgrammableTransaction(ptb) => message
299 .with_programmable_transaction(ptb)
300 .with_kind(Kind::ProgrammableTransaction),
301 K::ChangeEpoch(change_epoch) => message
305 .with_change_epoch(change_epoch)
306 .with_kind(Kind::ChangeEpoch),
307 K::Genesis(genesis) => message.with_genesis(genesis).with_kind(Kind::Genesis),
308 K::ConsensusCommitPrologue(prologue) => message
309 .with_consensus_commit_prologue(prologue)
310 .with_kind(Kind::ConsensusCommitPrologueV1),
311 K::AuthenticatorStateUpdate(update) => message
312 .with_authenticator_state_update(update)
313 .with_kind(Kind::AuthenticatorStateUpdate),
314 K::EndOfEpoch(transactions) => message
315 .with_end_of_epoch(EndOfEpochTransaction {
316 transactions: transactions.into_iter().map(Into::into).collect(),
317 })
318 .with_kind(Kind::EndOfEpoch),
319 K::RandomnessStateUpdate(update) => message
320 .with_randomness_state_update(update)
321 .with_kind(Kind::RandomnessStateUpdate),
322 K::ConsensusCommitPrologueV2(prologue) => message
323 .with_consensus_commit_prologue(prologue)
324 .with_kind(Kind::ConsensusCommitPrologueV2),
325 K::ConsensusCommitPrologueV3(prologue) => message
326 .with_consensus_commit_prologue(prologue)
327 .with_kind(Kind::ConsensusCommitPrologueV3),
328 K::ConsensusCommitPrologueV4(prologue) => message
329 .with_consensus_commit_prologue(prologue)
330 .with_kind(Kind::ConsensusCommitPrologueV4),
331 _ => message,
332 }
333 }
334}
335
336impl TryFrom<&TransactionKind> for sui_sdk_types::TransactionKind {
337 type Error = TryFromProtoError;
338
339 fn try_from(value: &TransactionKind) -> Result<Self, Self::Error> {
340 use transaction_kind::Kind;
341
342 match value.kind() {
343 Kind::Unknown => {
344 return Err(TryFromProtoError::invalid(
345 "kind",
346 "unknown TransactionKind",
347 ));
348 }
349 Kind::ProgrammableTransaction => {
350 Self::ProgrammableTransaction(value.programmable_transaction().try_into()?)
351 }
352 Kind::ChangeEpoch => Self::ChangeEpoch(value.change_epoch().try_into()?),
353 Kind::Genesis => Self::Genesis(value.genesis().try_into()?),
354 Kind::ConsensusCommitPrologueV1 => {
355 Self::ConsensusCommitPrologue(value.consensus_commit_prologue().try_into()?)
356 }
357 Kind::AuthenticatorStateUpdate => {
358 Self::AuthenticatorStateUpdate(value.authenticator_state_update().try_into()?)
359 }
360 Kind::EndOfEpoch => Self::EndOfEpoch(
361 value
362 .end_of_epoch()
363 .transactions()
364 .iter()
365 .map(TryInto::try_into)
366 .collect::<Result<_, _>>()?,
367 ),
368 Kind::RandomnessStateUpdate => {
369 Self::RandomnessStateUpdate(value.randomness_state_update().try_into()?)
370 }
371 Kind::ConsensusCommitPrologueV2 => {
372 Self::ConsensusCommitPrologueV2(value.consensus_commit_prologue().try_into()?)
373 }
374 Kind::ConsensusCommitPrologueV3 => {
375 Self::ConsensusCommitPrologueV3(value.consensus_commit_prologue().try_into()?)
376 }
377 Kind::ConsensusCommitPrologueV4 => {
378 Self::ConsensusCommitPrologueV4(value.consensus_commit_prologue().try_into()?)
379 }
380 }
381 .pipe(Ok)
382 }
383}
384
385impl From<sui_sdk_types::ConsensusCommitPrologue> for ConsensusCommitPrologue {
390 fn from(value: sui_sdk_types::ConsensusCommitPrologue) -> Self {
391 Self {
392 epoch: Some(value.epoch),
393 round: Some(value.round),
394 commit_timestamp: Some(crate::proto::timestamp_ms_to_proto(
395 value.commit_timestamp_ms,
396 )),
397 consensus_commit_digest: None,
398 sub_dag_index: None,
399 consensus_determined_version_assignments: None,
400 additional_state_digest: None,
401 }
402 }
403}
404
405impl TryFrom<&ConsensusCommitPrologue> for sui_sdk_types::ConsensusCommitPrologue {
406 type Error = TryFromProtoError;
407
408 fn try_from(value: &ConsensusCommitPrologue) -> Result<Self, Self::Error> {
409 let epoch = value
410 .epoch
411 .ok_or_else(|| TryFromProtoError::missing("epoch"))?;
412 let round = value
413 .round
414 .ok_or_else(|| TryFromProtoError::missing("round"))?;
415 let commit_timestamp_ms = value
416 .commit_timestamp
417 .ok_or_else(|| TryFromProtoError::missing("commit_timestamp"))?
418 .pipe(crate::proto::proto_to_timestamp_ms)?;
419
420 Ok(Self {
421 epoch,
422 round,
423 commit_timestamp_ms,
424 })
425 }
426}
427
428impl From<sui_sdk_types::ConsensusCommitPrologueV2> for ConsensusCommitPrologue {
429 fn from(value: sui_sdk_types::ConsensusCommitPrologueV2) -> Self {
430 Self {
431 epoch: Some(value.epoch),
432 round: Some(value.round),
433 commit_timestamp: Some(crate::proto::timestamp_ms_to_proto(
434 value.commit_timestamp_ms,
435 )),
436 consensus_commit_digest: Some(value.consensus_commit_digest.to_string()),
437 sub_dag_index: None,
438 consensus_determined_version_assignments: None,
439 additional_state_digest: None,
440 }
441 }
442}
443
444impl TryFrom<&ConsensusCommitPrologue> for sui_sdk_types::ConsensusCommitPrologueV2 {
445 type Error = TryFromProtoError;
446
447 fn try_from(value: &ConsensusCommitPrologue) -> Result<Self, Self::Error> {
448 let epoch = value
449 .epoch
450 .ok_or_else(|| TryFromProtoError::missing("epoch"))?;
451 let round = value
452 .round
453 .ok_or_else(|| TryFromProtoError::missing("round"))?;
454 let commit_timestamp_ms = value
455 .commit_timestamp
456 .ok_or_else(|| TryFromProtoError::missing("commit_timestamp"))?
457 .pipe(crate::proto::proto_to_timestamp_ms)?;
458
459 let consensus_commit_digest = value
460 .consensus_commit_digest
461 .as_ref()
462 .ok_or_else(|| TryFromProtoError::missing("consensus_commit_digest"))?
463 .parse()
464 .map_err(|e| {
465 TryFromProtoError::invalid(
466 ConsensusCommitPrologue::CONSENSUS_COMMIT_DIGEST_FIELD,
467 e,
468 )
469 })?;
470
471 Ok(Self {
472 epoch,
473 round,
474 commit_timestamp_ms,
475 consensus_commit_digest,
476 })
477 }
478}
479
480impl From<sui_sdk_types::ConsensusCommitPrologueV3> for ConsensusCommitPrologue {
481 fn from(value: sui_sdk_types::ConsensusCommitPrologueV3) -> Self {
482 Self {
483 epoch: Some(value.epoch),
484 round: Some(value.round),
485 commit_timestamp: Some(crate::proto::timestamp_ms_to_proto(
486 value.commit_timestamp_ms,
487 )),
488 consensus_commit_digest: Some(value.consensus_commit_digest.to_string()),
489 sub_dag_index: value.sub_dag_index,
490 consensus_determined_version_assignments: Some(
491 value.consensus_determined_version_assignments.into(),
492 ),
493 additional_state_digest: None,
494 }
495 }
496}
497
498impl TryFrom<&ConsensusCommitPrologue> for sui_sdk_types::ConsensusCommitPrologueV3 {
499 type Error = TryFromProtoError;
500
501 fn try_from(value: &ConsensusCommitPrologue) -> Result<Self, Self::Error> {
502 let epoch = value
503 .epoch
504 .ok_or_else(|| TryFromProtoError::missing("epoch"))?;
505 let round = value
506 .round
507 .ok_or_else(|| TryFromProtoError::missing("round"))?;
508 let commit_timestamp_ms = value
509 .commit_timestamp
510 .ok_or_else(|| TryFromProtoError::missing("commit_timestamp"))?
511 .pipe(crate::proto::proto_to_timestamp_ms)?;
512
513 let consensus_commit_digest = value
514 .consensus_commit_digest
515 .as_ref()
516 .ok_or_else(|| TryFromProtoError::missing("consensus_commit_digest"))?
517 .parse()
518 .map_err(|e| {
519 TryFromProtoError::invalid(
520 ConsensusCommitPrologue::CONSENSUS_COMMIT_DIGEST_FIELD,
521 e,
522 )
523 })?;
524
525 let consensus_determined_version_assignments = value
526 .consensus_determined_version_assignments
527 .as_ref()
528 .ok_or_else(|| TryFromProtoError::missing("consensus_determined_version_assignments"))?
529 .try_into()?;
530
531 Ok(Self {
532 epoch,
533 round,
534 commit_timestamp_ms,
535 sub_dag_index: value.sub_dag_index,
536 consensus_commit_digest,
537 consensus_determined_version_assignments,
538 })
539 }
540}
541
542impl From<sui_sdk_types::ConsensusCommitPrologueV4> for ConsensusCommitPrologue {
543 fn from(
544 sui_sdk_types::ConsensusCommitPrologueV4 {
545 epoch,
546 round,
547 sub_dag_index,
548 commit_timestamp_ms,
549 consensus_commit_digest,
550 consensus_determined_version_assignments,
551 additional_state_digest,
552 }: sui_sdk_types::ConsensusCommitPrologueV4,
553 ) -> Self {
554 Self {
555 epoch: Some(epoch),
556 round: Some(round),
557 commit_timestamp: Some(crate::proto::timestamp_ms_to_proto(commit_timestamp_ms)),
558 consensus_commit_digest: Some(consensus_commit_digest.to_string()),
559 sub_dag_index,
560 consensus_determined_version_assignments: Some(
561 consensus_determined_version_assignments.into(),
562 ),
563 additional_state_digest: Some(additional_state_digest.to_string()),
564 }
565 }
566}
567
568impl TryFrom<&ConsensusCommitPrologue> for sui_sdk_types::ConsensusCommitPrologueV4 {
569 type Error = TryFromProtoError;
570
571 fn try_from(value: &ConsensusCommitPrologue) -> Result<Self, Self::Error> {
572 let epoch = value
573 .epoch
574 .ok_or_else(|| TryFromProtoError::missing("epoch"))?;
575 let round = value
576 .round
577 .ok_or_else(|| TryFromProtoError::missing("round"))?;
578 let commit_timestamp_ms = value
579 .commit_timestamp
580 .ok_or_else(|| TryFromProtoError::missing("commit_timestamp"))?
581 .pipe(crate::proto::proto_to_timestamp_ms)?;
582
583 let consensus_commit_digest = value
584 .consensus_commit_digest
585 .as_ref()
586 .ok_or_else(|| TryFromProtoError::missing("consensus_commit_digest"))?
587 .parse()
588 .map_err(|e| {
589 TryFromProtoError::invalid(
590 ConsensusCommitPrologue::CONSENSUS_COMMIT_DIGEST_FIELD,
591 e,
592 )
593 })?;
594
595 let consensus_determined_version_assignments = value
596 .consensus_determined_version_assignments
597 .as_ref()
598 .ok_or_else(|| TryFromProtoError::missing("consensus_determined_version_assignments"))?
599 .try_into()?;
600
601 let additional_state_digest = value
602 .additional_state_digest
603 .as_ref()
604 .ok_or_else(|| TryFromProtoError::missing("additional_state_digest"))?
605 .parse()
606 .map_err(|e| {
607 TryFromProtoError::invalid(
608 ConsensusCommitPrologue::ADDITIONAL_STATE_DIGEST_FIELD,
609 e,
610 )
611 })?;
612
613 Ok(Self {
614 epoch,
615 round,
616 commit_timestamp_ms,
617 sub_dag_index: value.sub_dag_index,
618 consensus_commit_digest,
619 consensus_determined_version_assignments,
620 additional_state_digest,
621 })
622 }
623}
624
625impl From<sui_sdk_types::ConsensusDeterminedVersionAssignments>
630 for ConsensusDeterminedVersionAssignments
631{
632 fn from(value: sui_sdk_types::ConsensusDeterminedVersionAssignments) -> Self {
633 use sui_sdk_types::ConsensusDeterminedVersionAssignments::*;
634
635 let mut message = Self::default();
636
637 let version = match value {
638 CanceledTransactions {
639 canceled_transactions,
640 } => {
641 message.canceled_transactions =
642 canceled_transactions.into_iter().map(Into::into).collect();
643 1
644 }
645 CanceledTransactionsV2 {
646 canceled_transactions,
647 } => {
648 message.canceled_transactions =
649 canceled_transactions.into_iter().map(Into::into).collect();
650 2
651 }
652 _ => return Self::default(),
653 };
654
655 message.version = Some(version);
656 message
657 }
658}
659
660impl TryFrom<&ConsensusDeterminedVersionAssignments>
661 for sui_sdk_types::ConsensusDeterminedVersionAssignments
662{
663 type Error = TryFromProtoError;
664
665 fn try_from(value: &ConsensusDeterminedVersionAssignments) -> Result<Self, Self::Error> {
666 match value.version() {
667 1 => Self::CanceledTransactions {
668 canceled_transactions: value
669 .canceled_transactions
670 .iter()
671 .map(TryFrom::try_from)
672 .collect::<Result<_, _>>()?,
673 },
674 2 => Self::CanceledTransactionsV2 {
675 canceled_transactions: value
676 .canceled_transactions
677 .iter()
678 .map(TryFrom::try_from)
679 .collect::<Result<_, _>>()?,
680 },
681 _ => {
682 return Err(TryFromProtoError::invalid(
683 ConsensusDeterminedVersionAssignments::VERSION_FIELD,
684 "unknown ConsensusDeterminedVersionAssignments version",
685 ));
686 }
687 }
688 .pipe(Ok)
689 }
690}
691
692impl From<sui_sdk_types::CanceledTransaction> for CanceledTransaction {
697 fn from(value: sui_sdk_types::CanceledTransaction) -> Self {
698 Self {
699 digest: Some(value.digest.to_string()),
700 version_assignments: value
701 .version_assignments
702 .into_iter()
703 .map(Into::into)
704 .collect(),
705 }
706 }
707}
708
709impl TryFrom<&CanceledTransaction> for sui_sdk_types::CanceledTransaction {
710 type Error = TryFromProtoError;
711
712 fn try_from(value: &CanceledTransaction) -> Result<Self, Self::Error> {
713 let digest = value
714 .digest
715 .as_ref()
716 .ok_or_else(|| TryFromProtoError::missing("digest"))?
717 .parse()
718 .map_err(|e| TryFromProtoError::invalid(CanceledTransaction::DIGEST_FIELD, e))?;
719
720 let version_assignments = value
721 .version_assignments
722 .iter()
723 .map(TryInto::try_into)
724 .collect::<Result<_, _>>()?;
725
726 Ok(Self {
727 digest,
728 version_assignments,
729 })
730 }
731}
732
733impl From<sui_sdk_types::CanceledTransactionV2> for CanceledTransaction {
734 fn from(value: sui_sdk_types::CanceledTransactionV2) -> Self {
735 Self {
736 digest: Some(value.digest.to_string()),
737 version_assignments: value
738 .version_assignments
739 .into_iter()
740 .map(Into::into)
741 .collect(),
742 }
743 }
744}
745
746impl TryFrom<&CanceledTransaction> for sui_sdk_types::CanceledTransactionV2 {
747 type Error = TryFromProtoError;
748
749 fn try_from(value: &CanceledTransaction) -> Result<Self, Self::Error> {
750 let digest = value
751 .digest
752 .as_ref()
753 .ok_or_else(|| TryFromProtoError::missing("digest"))?
754 .parse()
755 .map_err(|e| TryFromProtoError::invalid(CanceledTransaction::DIGEST_FIELD, e))?;
756
757 let version_assignments = value
758 .version_assignments
759 .iter()
760 .map(TryInto::try_into)
761 .collect::<Result<_, _>>()?;
762
763 Ok(Self {
764 digest,
765 version_assignments,
766 })
767 }
768}
769
770impl From<sui_sdk_types::VersionAssignment> for VersionAssignment {
775 fn from(value: sui_sdk_types::VersionAssignment) -> Self {
776 Self {
777 object_id: Some(value.object_id.to_string()),
778 start_version: None,
779 version: Some(value.version),
780 }
781 }
782}
783
784impl TryFrom<&VersionAssignment> for sui_sdk_types::VersionAssignment {
785 type Error = TryFromProtoError;
786
787 fn try_from(value: &VersionAssignment) -> Result<Self, Self::Error> {
788 let object_id = value
789 .object_id
790 .as_ref()
791 .ok_or_else(|| TryFromProtoError::missing("object_id"))?
792 .parse()
793 .map_err(|e| TryFromProtoError::invalid(VersionAssignment::OBJECT_ID_FIELD, e))?;
794 let version = value
795 .version
796 .ok_or_else(|| TryFromProtoError::missing("version"))?;
797
798 Ok(Self { object_id, version })
799 }
800}
801
802impl From<sui_sdk_types::VersionAssignmentV2> for VersionAssignment {
803 fn from(value: sui_sdk_types::VersionAssignmentV2) -> Self {
804 Self {
805 object_id: Some(value.object_id.to_string()),
806 start_version: Some(value.start_version),
807 version: Some(value.version),
808 }
809 }
810}
811
812impl TryFrom<&VersionAssignment> for sui_sdk_types::VersionAssignmentV2 {
813 type Error = TryFromProtoError;
814
815 fn try_from(value: &VersionAssignment) -> Result<Self, Self::Error> {
816 let object_id = value
817 .object_id
818 .as_ref()
819 .ok_or_else(|| TryFromProtoError::missing("object_id"))?
820 .parse()
821 .map_err(|e| TryFromProtoError::invalid(VersionAssignment::OBJECT_ID_FIELD, e))?;
822 let start_version = value
823 .start_version
824 .ok_or_else(|| TryFromProtoError::missing(VersionAssignment::START_VERSION_FIELD))?;
825 let version = value
826 .version
827 .ok_or_else(|| TryFromProtoError::missing("version"))?;
828
829 Ok(Self {
830 object_id,
831 start_version,
832 version,
833 })
834 }
835}
836
837impl From<sui_sdk_types::GenesisTransaction> for GenesisTransaction {
842 fn from(value: sui_sdk_types::GenesisTransaction) -> Self {
843 Self {
844 objects: value.objects.into_iter().map(Into::into).collect(),
845 }
846 }
847}
848
849impl TryFrom<&GenesisTransaction> for sui_sdk_types::GenesisTransaction {
850 type Error = TryFromProtoError;
851
852 fn try_from(value: &GenesisTransaction) -> Result<Self, Self::Error> {
853 let objects = value
854 .objects
855 .iter()
856 .map(TryInto::try_into)
857 .collect::<Result<_, _>>()?;
858
859 Ok(Self { objects })
860 }
861}
862
863impl From<sui_sdk_types::RandomnessStateUpdate> for RandomnessStateUpdate {
868 fn from(value: sui_sdk_types::RandomnessStateUpdate) -> Self {
869 Self {
870 epoch: Some(value.epoch),
871 randomness_round: Some(value.randomness_round),
872 random_bytes: Some(value.random_bytes.into()),
873 randomness_object_initial_shared_version: Some(
874 value.randomness_obj_initial_shared_version,
875 ),
876 }
877 }
878}
879
880impl TryFrom<&RandomnessStateUpdate> for sui_sdk_types::RandomnessStateUpdate {
881 type Error = TryFromProtoError;
882
883 fn try_from(
884 RandomnessStateUpdate {
885 epoch,
886 randomness_round,
887 random_bytes,
888 randomness_object_initial_shared_version,
889 }: &RandomnessStateUpdate,
890 ) -> Result<Self, Self::Error> {
891 let epoch = epoch.ok_or_else(|| TryFromProtoError::missing("epoch"))?;
892 let randomness_round =
893 randomness_round.ok_or_else(|| TryFromProtoError::missing("randomness_round"))?;
894 let random_bytes = random_bytes
895 .as_ref()
896 .ok_or_else(|| TryFromProtoError::missing("random_bytes"))?
897 .to_vec();
898 let randomness_obj_initial_shared_version = randomness_object_initial_shared_version
899 .ok_or_else(|| {
900 TryFromProtoError::missing("randomness_object_initial_shared_version")
901 })?;
902 Ok(Self {
903 epoch,
904 randomness_round,
905 random_bytes,
906 randomness_obj_initial_shared_version,
907 })
908 }
909}
910
911impl From<sui_sdk_types::AuthenticatorStateUpdate> for AuthenticatorStateUpdate {
916 fn from(value: sui_sdk_types::AuthenticatorStateUpdate) -> Self {
917 Self {
918 epoch: Some(value.epoch),
919 round: Some(value.round),
920 new_active_jwks: value.new_active_jwks.into_iter().map(Into::into).collect(),
921 authenticator_object_initial_shared_version: Some(
922 value.authenticator_obj_initial_shared_version,
923 ),
924 }
925 }
926}
927
928impl TryFrom<&AuthenticatorStateUpdate> for sui_sdk_types::AuthenticatorStateUpdate {
929 type Error = TryFromProtoError;
930
931 fn try_from(
932 AuthenticatorStateUpdate {
933 epoch,
934 round,
935 new_active_jwks,
936 authenticator_object_initial_shared_version,
937 }: &AuthenticatorStateUpdate,
938 ) -> Result<Self, Self::Error> {
939 let epoch = epoch.ok_or_else(|| TryFromProtoError::missing("epoch"))?;
940 let round = round.ok_or_else(|| TryFromProtoError::missing("round"))?;
941 let authenticator_obj_initial_shared_version = authenticator_object_initial_shared_version
942 .ok_or_else(|| {
943 TryFromProtoError::missing("authenticator_object_initial_shared_version")
944 })?;
945 Ok(Self {
946 epoch,
947 round,
948 new_active_jwks: new_active_jwks
949 .iter()
950 .map(TryInto::try_into)
951 .collect::<Result<_, _>>()?,
952 authenticator_obj_initial_shared_version,
953 })
954 }
955}
956
957impl From<sui_sdk_types::Jwk> for Jwk {
962 fn from(sui_sdk_types::Jwk { kty, e, n, alg }: sui_sdk_types::Jwk) -> Self {
963 Self {
964 kty: Some(kty),
965 e: Some(e),
966 n: Some(n),
967 alg: Some(alg),
968 }
969 }
970}
971
972impl TryFrom<&Jwk> for sui_sdk_types::Jwk {
973 type Error = TryFromProtoError;
974
975 fn try_from(Jwk { kty, e, n, alg }: &Jwk) -> Result<Self, Self::Error> {
976 let kty = kty
977 .as_ref()
978 .ok_or_else(|| TryFromProtoError::missing("kty"))?
979 .into();
980 let e = e
981 .as_ref()
982 .ok_or_else(|| TryFromProtoError::missing("e"))?
983 .into();
984 let n = n
985 .as_ref()
986 .ok_or_else(|| TryFromProtoError::missing("n"))?
987 .into();
988 let alg = alg
989 .as_ref()
990 .ok_or_else(|| TryFromProtoError::missing("alg"))?
991 .into();
992 Ok(Self { kty, e, n, alg })
993 }
994}
995
996impl From<sui_sdk_types::JwkId> for JwkId {
1001 fn from(sui_sdk_types::JwkId { iss, kid }: sui_sdk_types::JwkId) -> Self {
1002 Self {
1003 iss: Some(iss),
1004 kid: Some(kid),
1005 }
1006 }
1007}
1008
1009impl From<&sui_sdk_types::JwkId> for JwkId {
1010 fn from(value: &sui_sdk_types::JwkId) -> Self {
1011 Self {
1012 iss: Some(value.iss.clone()),
1013 kid: Some(value.kid.clone()),
1014 }
1015 }
1016}
1017
1018impl TryFrom<&JwkId> for sui_sdk_types::JwkId {
1019 type Error = TryFromProtoError;
1020
1021 fn try_from(JwkId { iss, kid }: &JwkId) -> Result<Self, Self::Error> {
1022 let iss = iss
1023 .as_ref()
1024 .ok_or_else(|| TryFromProtoError::missing("iss"))?
1025 .into();
1026 let kid = kid
1027 .as_ref()
1028 .ok_or_else(|| TryFromProtoError::missing("kid"))?
1029 .into();
1030 Ok(Self { iss, kid })
1031 }
1032}
1033
1034impl From<sui_sdk_types::ActiveJwk> for ActiveJwk {
1039 fn from(value: sui_sdk_types::ActiveJwk) -> Self {
1040 Self {
1041 id: Some(value.jwk_id.into()),
1042 jwk: Some(value.jwk.into()),
1043 epoch: Some(value.epoch),
1044 }
1045 }
1046}
1047
1048impl TryFrom<&ActiveJwk> for sui_sdk_types::ActiveJwk {
1049 type Error = TryFromProtoError;
1050
1051 fn try_from(value: &ActiveJwk) -> Result<Self, Self::Error> {
1052 let jwk_id = value
1053 .id
1054 .as_ref()
1055 .ok_or_else(|| TryFromProtoError::missing("id"))?
1056 .try_into()?;
1057
1058 let jwk = value
1059 .jwk
1060 .as_ref()
1061 .ok_or_else(|| TryFromProtoError::missing("jwk"))?
1062 .try_into()?;
1063
1064 let epoch = value
1065 .epoch
1066 .ok_or_else(|| TryFromProtoError::missing("epoch"))?;
1067
1068 Ok(Self { jwk_id, jwk, epoch })
1069 }
1070}
1071
1072impl From<sui_sdk_types::ChangeEpoch> for ChangeEpoch {
1077 fn from(value: sui_sdk_types::ChangeEpoch) -> Self {
1078 Self {
1079 epoch: Some(value.epoch),
1080 protocol_version: Some(value.protocol_version),
1081 storage_charge: Some(value.storage_charge),
1082 computation_charge: Some(value.computation_charge),
1083 storage_rebate: Some(value.storage_rebate),
1084 non_refundable_storage_fee: Some(value.non_refundable_storage_fee),
1085 epoch_start_timestamp: Some(crate::proto::timestamp_ms_to_proto(
1086 value.epoch_start_timestamp_ms,
1087 )),
1088 system_packages: value.system_packages.into_iter().map(Into::into).collect(),
1089 }
1090 }
1091}
1092
1093impl TryFrom<&ChangeEpoch> for sui_sdk_types::ChangeEpoch {
1094 type Error = TryFromProtoError;
1095
1096 fn try_from(
1097 ChangeEpoch {
1098 epoch,
1099 protocol_version,
1100 storage_charge,
1101 computation_charge,
1102 storage_rebate,
1103 non_refundable_storage_fee,
1104 epoch_start_timestamp,
1105 system_packages,
1106 }: &ChangeEpoch,
1107 ) -> Result<Self, Self::Error> {
1108 let epoch = epoch.ok_or_else(|| TryFromProtoError::missing("epoch"))?;
1109 let protocol_version =
1110 protocol_version.ok_or_else(|| TryFromProtoError::missing("protocol_version"))?;
1111 let storage_charge =
1112 storage_charge.ok_or_else(|| TryFromProtoError::missing("storage_charge"))?;
1113 let computation_charge =
1114 computation_charge.ok_or_else(|| TryFromProtoError::missing("computation_charge"))?;
1115 let storage_rebate =
1116 storage_rebate.ok_or_else(|| TryFromProtoError::missing("storage_rebate"))?;
1117 let non_refundable_storage_fee = non_refundable_storage_fee
1118 .ok_or_else(|| TryFromProtoError::missing("non_refundable_storage_fee"))?;
1119 let epoch_start_timestamp_ms = epoch_start_timestamp
1120 .ok_or_else(|| TryFromProtoError::missing("epoch_start_timestamp_ms"))?
1121 .pipe(crate::proto::proto_to_timestamp_ms)?;
1122
1123 Ok(Self {
1124 epoch,
1125 protocol_version,
1126 storage_charge,
1127 computation_charge,
1128 storage_rebate,
1129 non_refundable_storage_fee,
1130 epoch_start_timestamp_ms,
1131 system_packages: system_packages
1132 .iter()
1133 .map(TryInto::try_into)
1134 .collect::<Result<_, _>>()?,
1135 })
1136 }
1137}
1138
1139impl From<sui_sdk_types::SystemPackage> for SystemPackage {
1144 fn from(value: sui_sdk_types::SystemPackage) -> Self {
1145 Self {
1146 version: Some(value.version),
1147 modules: value.modules.into_iter().map(Into::into).collect(),
1148 dependencies: value.dependencies.iter().map(ToString::to_string).collect(),
1149 }
1150 }
1151}
1152
1153impl TryFrom<&SystemPackage> for sui_sdk_types::SystemPackage {
1154 type Error = TryFromProtoError;
1155
1156 fn try_from(value: &SystemPackage) -> Result<Self, Self::Error> {
1157 Ok(Self {
1158 version: value
1159 .version
1160 .ok_or_else(|| TryFromProtoError::missing("version"))?,
1161 modules: value.modules.iter().map(|bytes| bytes.to_vec()).collect(),
1162 dependencies: value
1163 .dependencies
1164 .iter()
1165 .map(|s| s.parse())
1166 .collect::<Result<_, _>>()
1167 .map_err(|e| TryFromProtoError::invalid(SystemPackage::DEPENDENCIES_FIELD, e))?,
1168 })
1169 }
1170}
1171
1172impl From<sui_sdk_types::EndOfEpochTransactionKind> for EndOfEpochTransactionKind {
1177 fn from(value: sui_sdk_types::EndOfEpochTransactionKind) -> Self {
1178 use end_of_epoch_transaction_kind::Kind;
1179 use sui_sdk_types::EndOfEpochTransactionKind as K;
1180
1181 let message = Self::default();
1182
1183 match value {
1184 K::ChangeEpoch(change_epoch) => message
1185 .with_change_epoch(change_epoch)
1186 .with_kind(Kind::ChangeEpoch),
1187 K::AuthenticatorStateCreate => message.with_kind(Kind::AuthenticatorStateCreate),
1188 K::AuthenticatorStateExpire(expire) => message
1189 .with_authenticator_state_expire(expire)
1190 .with_kind(Kind::AuthenticatorStateExpire),
1191 K::RandomnessStateCreate => message.with_kind(Kind::RandomnessStateCreate),
1192 K::DenyListStateCreate => message.with_kind(Kind::DenyListStateCreate),
1193 K::BridgeStateCreate { chain_id } => message
1194 .with_bridge_chain_id(chain_id)
1195 .with_kind(Kind::BridgeStateCreate),
1196 K::BridgeCommitteeInit {
1197 bridge_object_version,
1198 } => message
1199 .with_bridge_object_version(bridge_object_version)
1200 .with_kind(Kind::BridgeCommitteeInit),
1201 K::StoreExecutionTimeObservations(observations) => message
1202 .with_execution_time_observations(observations)
1203 .with_kind(Kind::StoreExecutionTimeObservations),
1204 K::AccumulatorRootCreate => message.with_kind(Kind::AccumulatorRootCreate),
1205 K::CoinRegistryCreate => message.with_kind(Kind::CoinRegistryCreate),
1206 K::DisplayRegistryCreate => message.with_kind(Kind::DisplayRegistryCreate),
1207 K::AddressAliasStateCreate => message.with_kind(Kind::AddressAliasStateCreate),
1208 _ => message,
1209 }
1210 }
1211}
1212
1213impl TryFrom<&EndOfEpochTransactionKind> for sui_sdk_types::EndOfEpochTransactionKind {
1214 type Error = TryFromProtoError;
1215
1216 fn try_from(value: &EndOfEpochTransactionKind) -> Result<Self, Self::Error> {
1217 use end_of_epoch_transaction_kind::Kind;
1218
1219 match value.kind() {
1220 Kind::Unknown => {
1221 return Err(TryFromProtoError::invalid(
1222 EndOfEpochTransactionKind::KIND_FIELD,
1223 "unknown EndOfEpochTransactionKind",
1224 ));
1225 }
1226 Kind::ChangeEpoch => Self::ChangeEpoch(value.change_epoch().try_into()?),
1227 Kind::AuthenticatorStateCreate => Self::AuthenticatorStateCreate,
1228 Kind::AuthenticatorStateExpire => {
1229 Self::AuthenticatorStateExpire(value.authenticator_state_expire().try_into()?)
1230 }
1231 Kind::RandomnessStateCreate => Self::RandomnessStateCreate,
1232 Kind::DenyListStateCreate => Self::DenyListStateCreate,
1233 Kind::BridgeStateCreate => Self::BridgeStateCreate {
1234 chain_id: value.bridge_chain_id().parse().map_err(|e| {
1235 TryFromProtoError::invalid(EndOfEpochTransactionKind::BRIDGE_CHAIN_ID_FIELD, e)
1236 })?,
1237 },
1238 Kind::BridgeCommitteeInit => Self::BridgeCommitteeInit {
1239 bridge_object_version: value.bridge_object_version(),
1240 },
1241 Kind::StoreExecutionTimeObservations => Self::StoreExecutionTimeObservations(
1242 value.execution_time_observations().try_into()?,
1243 ),
1244 Kind::AccumulatorRootCreate => Self::AccumulatorRootCreate,
1245 Kind::CoinRegistryCreate => Self::CoinRegistryCreate,
1246 Kind::DisplayRegistryCreate => Self::DisplayRegistryCreate,
1247 Kind::AddressAliasStateCreate => Self::AddressAliasStateCreate,
1248 }
1249 .pipe(Ok)
1250 }
1251}
1252
1253impl From<sui_sdk_types::AuthenticatorStateExpire> for AuthenticatorStateExpire {
1258 fn from(value: sui_sdk_types::AuthenticatorStateExpire) -> Self {
1259 Self {
1260 min_epoch: Some(value.min_epoch),
1261 authenticator_object_initial_shared_version: Some(
1262 value.authenticator_object_initial_shared_version,
1263 ),
1264 }
1265 }
1266}
1267
1268impl TryFrom<&AuthenticatorStateExpire> for sui_sdk_types::AuthenticatorStateExpire {
1269 type Error = TryFromProtoError;
1270
1271 fn try_from(
1272 AuthenticatorStateExpire {
1273 min_epoch,
1274 authenticator_object_initial_shared_version,
1275 }: &AuthenticatorStateExpire,
1276 ) -> Result<Self, Self::Error> {
1277 let min_epoch = min_epoch.ok_or_else(|| TryFromProtoError::missing("min_epoch"))?;
1278 let authenticator_object_initial_shared_version =
1279 authenticator_object_initial_shared_version.ok_or_else(|| {
1280 TryFromProtoError::missing("authenticator_object_initial_shared_version")
1281 })?;
1282 Ok(Self {
1283 min_epoch,
1284 authenticator_object_initial_shared_version,
1285 })
1286 }
1287}
1288
1289impl From<sui_sdk_types::ExecutionTimeObservations> for ExecutionTimeObservations {
1292 fn from(value: sui_sdk_types::ExecutionTimeObservations) -> Self {
1293 match value {
1294 sui_sdk_types::ExecutionTimeObservations::V1(vec) => Self {
1295 version: Some(1),
1296 observations: vec.into_iter().map(Into::into).collect(),
1297 },
1298 _ => Self::default(),
1299 }
1300 }
1301}
1302
1303impl TryFrom<&ExecutionTimeObservations> for sui_sdk_types::ExecutionTimeObservations {
1304 type Error = TryFromProtoError;
1305
1306 fn try_from(value: &ExecutionTimeObservations) -> Result<Self, Self::Error> {
1307 Ok(Self::V1(
1308 value
1309 .observations
1310 .iter()
1311 .map(|observation| observation.try_into())
1312 .collect::<Result<_, _>>()?,
1313 ))
1314 }
1315}
1316
1317impl
1318 From<(
1319 sui_sdk_types::ExecutionTimeObservationKey,
1320 Vec<sui_sdk_types::ValidatorExecutionTimeObservation>,
1321 )> for ExecutionTimeObservation
1322{
1323 fn from(
1324 value: (
1325 sui_sdk_types::ExecutionTimeObservationKey,
1326 Vec<sui_sdk_types::ValidatorExecutionTimeObservation>,
1327 ),
1328 ) -> Self {
1329 use execution_time_observation::ExecutionTimeObservationKind;
1330 use sui_sdk_types::ExecutionTimeObservationKey;
1331
1332 let mut message = Self::default();
1333
1334 let kind = match value.0 {
1335 ExecutionTimeObservationKey::MoveEntryPoint {
1336 package,
1337 module,
1338 function,
1339 type_arguments,
1340 } => {
1341 message.move_entry_point = Some(MoveCall {
1342 package: Some(package.to_string()),
1343 module: Some(module),
1344 function: Some(function),
1345 type_arguments: type_arguments
1346 .into_iter()
1347 .map(|ty| ty.to_string())
1348 .collect(),
1349 arguments: Vec::new(),
1350 });
1351 ExecutionTimeObservationKind::MoveEntryPoint
1352 }
1353 ExecutionTimeObservationKey::TransferObjects => {
1354 ExecutionTimeObservationKind::TransferObjects
1355 }
1356 ExecutionTimeObservationKey::SplitCoins => ExecutionTimeObservationKind::SplitCoins,
1357 ExecutionTimeObservationKey::MergeCoins => ExecutionTimeObservationKind::MergeCoins,
1358 ExecutionTimeObservationKey::Publish => ExecutionTimeObservationKind::Publish,
1359 ExecutionTimeObservationKey::MakeMoveVec => {
1360 ExecutionTimeObservationKind::MakeMoveVector
1361 }
1362 ExecutionTimeObservationKey::Upgrade => ExecutionTimeObservationKind::Upgrade,
1363
1364 _ => ExecutionTimeObservationKind::Unknown,
1365 };
1366
1367 message.validator_observations = value.1.into_iter().map(Into::into).collect();
1368 message.set_kind(kind);
1369 message
1370 }
1371}
1372
1373impl TryFrom<&ExecutionTimeObservation>
1374 for (
1375 sui_sdk_types::ExecutionTimeObservationKey,
1376 Vec<sui_sdk_types::ValidatorExecutionTimeObservation>,
1377 )
1378{
1379 type Error = TryFromProtoError;
1380
1381 fn try_from(value: &ExecutionTimeObservation) -> Result<Self, Self::Error> {
1382 use execution_time_observation::ExecutionTimeObservationKind;
1383 use sui_sdk_types::ExecutionTimeObservationKey;
1384
1385 let key = match value.kind() {
1386 ExecutionTimeObservationKind::Unknown => {
1387 return Err(TryFromProtoError::invalid(
1388 ExecutionTimeObservation::KIND_FIELD,
1389 "unknown ExecutionTimeObservationKind",
1390 ));
1391 }
1392 ExecutionTimeObservationKind::MoveEntryPoint => {
1393 let move_call = value
1394 .move_entry_point
1395 .as_ref()
1396 .ok_or_else(|| TryFromProtoError::missing("move_entry_point"))?;
1397 ExecutionTimeObservationKey::MoveEntryPoint {
1398 package: move_call
1399 .package()
1400 .parse()
1401 .map_err(|e| TryFromProtoError::invalid(MoveCall::PACKAGE_FIELD, e))?,
1402 module: move_call.module().to_owned(),
1403 function: move_call.function().to_owned(),
1404 type_arguments: move_call
1405 .type_arguments
1406 .iter()
1407 .map(|t| {
1408 t.parse().map_err(|e| {
1409 TryFromProtoError::invalid(MoveCall::TYPE_ARGUMENTS_FIELD, e)
1410 })
1411 })
1412 .collect::<Result<_, _>>()?,
1413 }
1414 }
1415 ExecutionTimeObservationKind::TransferObjects => {
1416 ExecutionTimeObservationKey::TransferObjects
1417 }
1418 ExecutionTimeObservationKind::SplitCoins => ExecutionTimeObservationKey::SplitCoins,
1419 ExecutionTimeObservationKind::MergeCoins => ExecutionTimeObservationKey::MergeCoins,
1420 ExecutionTimeObservationKind::Publish => ExecutionTimeObservationKey::Publish,
1421 ExecutionTimeObservationKind::MakeMoveVector => {
1422 ExecutionTimeObservationKey::MakeMoveVec
1423 }
1424 ExecutionTimeObservationKind::Upgrade => ExecutionTimeObservationKey::Upgrade,
1425 };
1426
1427 let observations = value
1428 .validator_observations
1429 .iter()
1430 .map(sui_sdk_types::ValidatorExecutionTimeObservation::try_from)
1431 .collect::<Result<_, _>>()?;
1432
1433 Ok((key, observations))
1434 }
1435}
1436
1437impl From<sui_sdk_types::ValidatorExecutionTimeObservation> for ValidatorExecutionTimeObservation {
1440 fn from(value: sui_sdk_types::ValidatorExecutionTimeObservation) -> Self {
1441 Self {
1442 validator: Some(value.validator.as_bytes().to_vec().into()),
1443 duration: Some(prost_types::Duration {
1444 seconds: value.duration.as_secs() as i64,
1445 nanos: value.duration.subsec_nanos() as i32,
1446 }),
1447 }
1448 }
1449}
1450
1451impl TryFrom<&ValidatorExecutionTimeObservation>
1452 for sui_sdk_types::ValidatorExecutionTimeObservation
1453{
1454 type Error = TryFromProtoError;
1455
1456 fn try_from(value: &ValidatorExecutionTimeObservation) -> Result<Self, Self::Error> {
1457 Ok(Self {
1458 validator: value
1459 .validator
1460 .as_ref()
1461 .ok_or_else(|| TryFromProtoError::missing("validator"))?
1462 .as_ref()
1463 .pipe(sui_sdk_types::Bls12381PublicKey::from_bytes)
1464 .map_err(|e| {
1465 TryFromProtoError::invalid(
1466 ValidatorExecutionTimeObservation::VALIDATOR_FIELD,
1467 e,
1468 )
1469 })?,
1470 duration: value
1471 .duration
1472 .ok_or_else(|| TryFromProtoError::missing("duration"))?
1473 .try_into()
1474 .map_err(|e| {
1475 TryFromProtoError::invalid(ValidatorExecutionTimeObservation::DURATION_FIELD, e)
1476 })?,
1477 })
1478 }
1479}
1480
1481impl From<sui_sdk_types::ProgrammableTransaction> for ProgrammableTransaction {
1486 fn from(value: sui_sdk_types::ProgrammableTransaction) -> Self {
1487 Self {
1488 inputs: value.inputs.into_iter().map(Into::into).collect(),
1489 commands: value.commands.into_iter().map(Into::into).collect(),
1490 }
1491 }
1492}
1493
1494impl TryFrom<&ProgrammableTransaction> for sui_sdk_types::ProgrammableTransaction {
1495 type Error = TryFromProtoError;
1496
1497 fn try_from(value: &ProgrammableTransaction) -> Result<Self, Self::Error> {
1498 Ok(Self {
1499 inputs: value
1500 .inputs
1501 .iter()
1502 .map(TryInto::try_into)
1503 .collect::<Result<_, _>>()?,
1504 commands: value
1505 .commands
1506 .iter()
1507 .map(TryInto::try_into)
1508 .collect::<Result<_, _>>()?,
1509 })
1510 }
1511}
1512
1513impl From<sui_sdk_types::Input> for Input {
1518 fn from(value: sui_sdk_types::Input) -> Self {
1519 use input::InputKind;
1520 use sui_sdk_types::Input::*;
1521
1522 let mut message = Self::default();
1523
1524 let kind = match value {
1525 Pure(value) => {
1526 message.pure = Some(value.into());
1527 InputKind::Pure
1528 }
1529 ImmutableOrOwned(reference) => {
1530 message.object_id = Some(reference.object_id().to_string());
1531 message.version = Some(reference.version());
1532 message.digest = Some(reference.digest().to_string());
1533 InputKind::ImmutableOrOwned
1534 }
1535 Shared(shared_input) => {
1536 message.object_id = Some(shared_input.object_id().to_string());
1537 message.version = Some(shared_input.version());
1538 message.mutable = Some(shared_input.mutability().is_mutable());
1539 message.set_mutability(shared_input.mutability().into());
1540
1541 InputKind::Shared
1542 }
1543 Receiving(reference) => {
1544 message.object_id = Some(reference.object_id().to_string());
1545 message.version = Some(reference.version());
1546 message.digest = Some(reference.digest().to_string());
1547 InputKind::Receiving
1548 }
1549 FundsWithdrawal(funds_withdrawal) => {
1550 message.set_funds_withdrawal(funds_withdrawal);
1551 InputKind::FundsWithdrawal
1552 }
1553 _ => InputKind::Unknown,
1554 };
1555
1556 message.set_kind(kind);
1557 message
1558 }
1559}
1560
1561impl TryFrom<&Input> for sui_sdk_types::Input {
1562 type Error = TryFromProtoError;
1563
1564 fn try_from(value: &Input) -> Result<Self, Self::Error> {
1565 use input::InputKind;
1566
1567 match value.kind() {
1568 InputKind::Unknown => {
1569 return Err(TryFromProtoError::invalid(
1570 Input::KIND_FIELD,
1571 "unknown InputKind",
1572 ));
1573 }
1574 InputKind::Pure => Self::Pure(
1575 value
1576 .pure
1577 .as_ref()
1578 .ok_or_else(|| TryFromProtoError::missing("pure"))?
1579 .to_vec(),
1580 ),
1581 InputKind::ImmutableOrOwned => {
1582 let object_id = value
1583 .object_id
1584 .as_ref()
1585 .ok_or_else(|| TryFromProtoError::missing("object_id"))?
1586 .parse()
1587 .map_err(|e| TryFromProtoError::invalid(Input::OBJECT_ID_FIELD, e))?;
1588 let version = value
1589 .version
1590 .ok_or_else(|| TryFromProtoError::missing("version"))?;
1591 let digest = value
1592 .digest
1593 .as_ref()
1594 .ok_or_else(|| TryFromProtoError::missing("digest"))?
1595 .parse()
1596 .map_err(|e| TryFromProtoError::invalid(Input::DIGEST_FIELD, e))?;
1597 let reference = sui_sdk_types::ObjectReference::new(object_id, version, digest);
1598 Self::ImmutableOrOwned(reference)
1599 }
1600 InputKind::Shared => {
1601 let object_id = value
1602 .object_id
1603 .as_ref()
1604 .ok_or_else(|| TryFromProtoError::missing("object_id"))?
1605 .parse()
1606 .map_err(|e| TryFromProtoError::invalid(Input::OBJECT_ID_FIELD, e))?;
1607 let initial_shared_version = value
1608 .version
1609 .ok_or_else(|| TryFromProtoError::missing("version"))?;
1610
1611 let shared_input = match value.mutability() {
1612 input::Mutability::Unknown => {
1613 let mutable = value
1614 .mutable
1615 .ok_or_else(|| TryFromProtoError::missing("mutable"))?;
1616 sui_sdk_types::SharedInput::new(object_id, initial_shared_version, mutable)
1617 }
1618 input::Mutability::Immutable => sui_sdk_types::SharedInput::new(
1619 object_id,
1620 initial_shared_version,
1621 sui_sdk_types::Mutability::Immutable,
1622 ),
1623 input::Mutability::Mutable => sui_sdk_types::SharedInput::new(
1624 object_id,
1625 initial_shared_version,
1626 sui_sdk_types::Mutability::Mutable,
1627 ),
1628 input::Mutability::NonExclusiveWrite => sui_sdk_types::SharedInput::new(
1629 object_id,
1630 initial_shared_version,
1631 sui_sdk_types::Mutability::NonExclusiveWrite,
1632 ),
1633 };
1634
1635 Self::Shared(shared_input)
1636 }
1637 InputKind::Receiving => {
1638 let object_id = value
1639 .object_id
1640 .as_ref()
1641 .ok_or_else(|| TryFromProtoError::missing("object_id"))?
1642 .parse()
1643 .map_err(|e| TryFromProtoError::invalid(Input::OBJECT_ID_FIELD, e))?;
1644 let version = value
1645 .version
1646 .ok_or_else(|| TryFromProtoError::missing("version"))?;
1647 let digest = value
1648 .digest
1649 .as_ref()
1650 .ok_or_else(|| TryFromProtoError::missing("digest"))?
1651 .parse()
1652 .map_err(|e| TryFromProtoError::invalid(Input::DIGEST_FIELD, e))?;
1653 let reference = sui_sdk_types::ObjectReference::new(object_id, version, digest);
1654 Self::Receiving(reference)
1655 }
1656 InputKind::FundsWithdrawal => {
1657 let funds_withdrawal = value
1658 .funds_withdrawal_opt()
1659 .ok_or_else(|| TryFromProtoError::missing("funds_withdrawal"))?
1660 .try_into()?;
1661 Self::FundsWithdrawal(funds_withdrawal)
1662 }
1663 }
1664 .pipe(Ok)
1665 }
1666}
1667
1668impl From<sui_sdk_types::Mutability> for input::Mutability {
1669 fn from(value: sui_sdk_types::Mutability) -> Self {
1670 match value {
1671 sui_sdk_types::Mutability::Immutable => Self::Immutable,
1672 sui_sdk_types::Mutability::Mutable => Self::Mutable,
1673 sui_sdk_types::Mutability::NonExclusiveWrite => Self::NonExclusiveWrite,
1674 }
1675 }
1676}
1677
1678impl From<sui_sdk_types::FundsWithdrawal> for FundsWithdrawal {
1683 fn from(value: sui_sdk_types::FundsWithdrawal) -> Self {
1684 let mut message = Self::default();
1685 message.set_coin_type(value.coin_type());
1686 message.set_source(value.source().into());
1687 message.amount = value.amount();
1688 message
1689 }
1690}
1691
1692impl TryFrom<&FundsWithdrawal> for sui_sdk_types::FundsWithdrawal {
1693 type Error = TryFromProtoError;
1694
1695 fn try_from(value: &FundsWithdrawal) -> Result<Self, Self::Error> {
1696 use funds_withdrawal::Source;
1697
1698 let amount = value
1699 .amount_opt()
1700 .ok_or_else(|| TryFromProtoError::missing("amount"))?;
1701 let coin_type = value
1702 .coin_type_opt()
1703 .ok_or_else(|| TryFromProtoError::missing("coin_type"))?
1704 .parse()
1705 .map_err(|e| TryFromProtoError::invalid("coin_type", e))?;
1706 let source = match value.source() {
1707 Source::Unknown => return Err(TryFromProtoError::invalid("source", "unknown source")),
1708 Source::Sender => sui_sdk_types::WithdrawFrom::Sender,
1709 Source::Sponsor => sui_sdk_types::WithdrawFrom::Sponsor,
1710 };
1711
1712 Ok(Self::new(amount, coin_type, source))
1713 }
1714}
1715
1716impl From<sui_sdk_types::WithdrawFrom> for funds_withdrawal::Source {
1717 fn from(value: sui_sdk_types::WithdrawFrom) -> Self {
1718 match value {
1719 sui_sdk_types::WithdrawFrom::Sender => Self::Sender,
1720 sui_sdk_types::WithdrawFrom::Sponsor => Self::Sponsor,
1721 _ => Self::Unknown,
1722 }
1723 }
1724}
1725
1726impl Argument {
1731 pub fn gas() -> Self {
1732 Self {
1733 kind: Some(argument::ArgumentKind::Gas.into()),
1734 input: None,
1735 result: None,
1736 subresult: None,
1737 }
1738 }
1739
1740 pub fn new_input(input: u16) -> Self {
1741 Self {
1742 kind: Some(argument::ArgumentKind::Input.into()),
1743 input: Some(input.into()),
1744 result: None,
1745 subresult: None,
1746 }
1747 }
1748
1749 pub fn new_result(command: u16) -> Self {
1750 Self {
1751 kind: Some(argument::ArgumentKind::Result.into()),
1752 input: None,
1753 result: Some(command.into()),
1754 subresult: None,
1755 }
1756 }
1757
1758 pub fn nested_result(command: u16, subresult: u16) -> Self {
1759 Self {
1760 kind: Some(argument::ArgumentKind::Result.into()),
1761 input: None,
1762 result: Some(command.into()),
1763 subresult: Some(subresult.into()),
1764 }
1765 }
1766}
1767
1768impl From<sui_sdk_types::Argument> for Argument {
1769 fn from(value: sui_sdk_types::Argument) -> Self {
1770 use argument::ArgumentKind;
1771 use sui_sdk_types::Argument::*;
1772
1773 let mut message = Self::default();
1774
1775 let kind = match value {
1776 Gas => ArgumentKind::Gas,
1777 Input(input) => {
1778 message.input = Some(input.into());
1779 ArgumentKind::Input
1780 }
1781 Result(result) => {
1782 message.result = Some(result.into());
1783 ArgumentKind::Result
1784 }
1785 NestedResult(result, subresult) => {
1786 message.result = Some(result.into());
1787 message.subresult = Some(subresult.into());
1788 ArgumentKind::Result
1789 }
1790 };
1791
1792 message.set_kind(kind);
1793 message
1794 }
1795}
1796
1797impl TryFrom<&Argument> for sui_sdk_types::Argument {
1798 type Error = TryFromProtoError;
1799
1800 fn try_from(value: &Argument) -> Result<Self, Self::Error> {
1801 use argument::ArgumentKind;
1802
1803 match value.kind() {
1804 ArgumentKind::Unknown => {
1805 return Err(TryFromProtoError::invalid(
1806 Argument::KIND_FIELD,
1807 "unknown ArgumentKind",
1808 ));
1809 }
1810 ArgumentKind::Gas => Self::Gas,
1811 ArgumentKind::Input => {
1812 let input = value
1813 .input
1814 .ok_or_else(|| TryFromProtoError::missing("input"))?
1815 .try_into()
1816 .map_err(|e| TryFromProtoError::invalid(Argument::INPUT_FIELD, e))?;
1817 Self::Input(input)
1818 }
1819 ArgumentKind::Result => {
1820 let result = value
1821 .result
1822 .ok_or_else(|| TryFromProtoError::missing("result"))?
1823 .try_into()
1824 .map_err(|e| TryFromProtoError::invalid(Argument::RESULT_FIELD, e))?;
1825
1826 if let Some(subresult) = value.subresult {
1827 Self::NestedResult(
1828 result,
1829 subresult.try_into().map_err(|e| {
1830 TryFromProtoError::invalid(Argument::SUBRESULT_FIELD, e)
1831 })?,
1832 )
1833 } else {
1834 Self::Result(result)
1835 }
1836 }
1837 }
1838 .pipe(Ok)
1839 }
1840}
1841
1842impl From<command::Command> for Command {
1847 fn from(value: command::Command) -> Self {
1848 Self {
1849 command: Some(value),
1850 }
1851 }
1852}
1853
1854impl From<MoveCall> for command::Command {
1855 fn from(value: MoveCall) -> Self {
1856 Self::MoveCall(value)
1857 }
1858}
1859
1860impl From<MoveCall> for Command {
1861 fn from(value: MoveCall) -> Self {
1862 command::Command::from(value).into()
1863 }
1864}
1865
1866impl From<TransferObjects> for command::Command {
1867 fn from(value: TransferObjects) -> Self {
1868 Self::TransferObjects(value)
1869 }
1870}
1871
1872impl From<TransferObjects> for Command {
1873 fn from(value: TransferObjects) -> Self {
1874 command::Command::from(value).into()
1875 }
1876}
1877
1878impl From<sui_sdk_types::Command> for Command {
1879 fn from(value: sui_sdk_types::Command) -> Self {
1880 use command::Command;
1881 use sui_sdk_types::Command::*;
1882
1883 let command = match value {
1884 MoveCall(move_call) => Command::MoveCall(move_call.into()),
1885 TransferObjects(transfer_objects) => Command::TransferObjects(transfer_objects.into()),
1886 SplitCoins(split_coins) => Command::SplitCoins(split_coins.into()),
1887 MergeCoins(merge_coins) => Command::MergeCoins(merge_coins.into()),
1888 Publish(publish) => Command::Publish(publish.into()),
1889 MakeMoveVector(make_move_vector) => Command::MakeMoveVector(make_move_vector.into()),
1890 Upgrade(upgrade) => Command::Upgrade(upgrade.into()),
1891
1892 _ => return Self::default(),
1894 };
1895
1896 Self {
1897 command: Some(command),
1898 }
1899 }
1900}
1901
1902impl TryFrom<&Command> for sui_sdk_types::Command {
1903 type Error = TryFromProtoError;
1904
1905 fn try_from(value: &Command) -> Result<Self, Self::Error> {
1906 use command::Command;
1907
1908 match value
1909 .command
1910 .as_ref()
1911 .ok_or_else(|| TryFromProtoError::missing("command"))?
1912 {
1913 Command::MoveCall(move_call) => Self::MoveCall(move_call.try_into()?),
1914 Command::TransferObjects(transfer_objects) => {
1915 Self::TransferObjects(transfer_objects.try_into()?)
1916 }
1917 Command::SplitCoins(split_coins) => Self::SplitCoins(split_coins.try_into()?),
1918 Command::MergeCoins(merge_coins) => Self::MergeCoins(merge_coins.try_into()?),
1919 Command::Publish(publish) => Self::Publish(publish.try_into()?),
1920 Command::MakeMoveVector(make_move_vector) => {
1921 Self::MakeMoveVector(make_move_vector.try_into()?)
1922 }
1923 Command::Upgrade(upgrade) => Self::Upgrade(upgrade.try_into()?),
1924 }
1925 .pipe(Ok)
1926 }
1927}
1928
1929impl From<sui_sdk_types::MoveCall> for MoveCall {
1934 fn from(value: sui_sdk_types::MoveCall) -> Self {
1935 Self {
1936 package: Some(value.package.to_string()),
1937 module: Some(value.module.to_string()),
1938 function: Some(value.function.to_string()),
1939 type_arguments: value
1940 .type_arguments
1941 .iter()
1942 .map(ToString::to_string)
1943 .collect(),
1944 arguments: value.arguments.into_iter().map(Into::into).collect(),
1945 }
1946 }
1947}
1948
1949impl TryFrom<&MoveCall> for sui_sdk_types::MoveCall {
1950 type Error = TryFromProtoError;
1951
1952 fn try_from(value: &MoveCall) -> Result<Self, Self::Error> {
1953 let package = value
1954 .package
1955 .as_ref()
1956 .ok_or_else(|| TryFromProtoError::missing("package"))?
1957 .parse()
1958 .map_err(|e| TryFromProtoError::invalid(MoveCall::PACKAGE_FIELD, e))?;
1959
1960 let module = value
1961 .module
1962 .as_ref()
1963 .ok_or_else(|| TryFromProtoError::missing("module"))?
1964 .parse()
1965 .map_err(|e| TryFromProtoError::invalid(MoveCall::MODULE_FIELD, e))?;
1966
1967 let function = value
1968 .function
1969 .as_ref()
1970 .ok_or_else(|| TryFromProtoError::missing("function"))?
1971 .parse()
1972 .map_err(|e| TryFromProtoError::invalid(MoveCall::FUNCTION_FIELD, e))?;
1973
1974 let type_arguments = value
1975 .type_arguments
1976 .iter()
1977 .map(|t| {
1978 t.parse()
1979 .map_err(|e| TryFromProtoError::invalid(MoveCall::TYPE_ARGUMENTS_FIELD, e))
1980 })
1981 .collect::<Result<_, _>>()?;
1982 let arguments = value
1983 .arguments
1984 .iter()
1985 .map(TryInto::try_into)
1986 .collect::<Result<_, _>>()?;
1987
1988 Ok(Self {
1989 package,
1990 module,
1991 function,
1992 type_arguments,
1993 arguments,
1994 })
1995 }
1996}
1997
1998impl From<sui_sdk_types::TransferObjects> for TransferObjects {
2003 fn from(value: sui_sdk_types::TransferObjects) -> Self {
2004 Self {
2005 objects: value.objects.into_iter().map(Into::into).collect(),
2006 address: Some(value.address.into()),
2007 }
2008 }
2009}
2010
2011impl TryFrom<&TransferObjects> for sui_sdk_types::TransferObjects {
2012 type Error = TryFromProtoError;
2013
2014 fn try_from(value: &TransferObjects) -> Result<Self, Self::Error> {
2015 let objects = value
2016 .objects
2017 .iter()
2018 .map(TryInto::try_into)
2019 .collect::<Result<_, _>>()?;
2020
2021 let address = value
2022 .address
2023 .as_ref()
2024 .ok_or_else(|| TryFromProtoError::missing("address"))?
2025 .try_into()?;
2026
2027 Ok(Self { objects, address })
2028 }
2029}
2030
2031impl From<sui_sdk_types::SplitCoins> for SplitCoins {
2036 fn from(value: sui_sdk_types::SplitCoins) -> Self {
2037 Self {
2038 coin: Some(value.coin.into()),
2039 amounts: value.amounts.into_iter().map(Into::into).collect(),
2040 }
2041 }
2042}
2043
2044impl TryFrom<&SplitCoins> for sui_sdk_types::SplitCoins {
2045 type Error = TryFromProtoError;
2046
2047 fn try_from(value: &SplitCoins) -> Result<Self, Self::Error> {
2048 let coin = value
2049 .coin
2050 .as_ref()
2051 .ok_or_else(|| TryFromProtoError::missing("coin"))?
2052 .try_into()?;
2053
2054 let amounts = value
2055 .amounts
2056 .iter()
2057 .map(TryInto::try_into)
2058 .collect::<Result<_, _>>()?;
2059
2060 Ok(Self { coin, amounts })
2061 }
2062}
2063
2064impl From<sui_sdk_types::MergeCoins> for MergeCoins {
2069 fn from(value: sui_sdk_types::MergeCoins) -> Self {
2070 Self {
2071 coin: Some(value.coin.into()),
2072 coins_to_merge: value.coins_to_merge.into_iter().map(Into::into).collect(),
2073 }
2074 }
2075}
2076
2077impl TryFrom<&MergeCoins> for sui_sdk_types::MergeCoins {
2078 type Error = TryFromProtoError;
2079
2080 fn try_from(value: &MergeCoins) -> Result<Self, Self::Error> {
2081 let coin = value
2082 .coin
2083 .as_ref()
2084 .ok_or_else(|| TryFromProtoError::missing("coin"))?
2085 .try_into()?;
2086
2087 let coins_to_merge = value
2088 .coins_to_merge
2089 .iter()
2090 .map(TryInto::try_into)
2091 .collect::<Result<_, _>>()?;
2092
2093 Ok(Self {
2094 coin,
2095 coins_to_merge,
2096 })
2097 }
2098}
2099
2100impl From<sui_sdk_types::Publish> for Publish {
2105 fn from(value: sui_sdk_types::Publish) -> Self {
2106 Self {
2107 modules: value.modules.into_iter().map(Into::into).collect(),
2108 dependencies: value.dependencies.iter().map(ToString::to_string).collect(),
2109 }
2110 }
2111}
2112
2113impl TryFrom<&Publish> for sui_sdk_types::Publish {
2114 type Error = TryFromProtoError;
2115
2116 fn try_from(value: &Publish) -> Result<Self, Self::Error> {
2117 let modules = value.modules.iter().map(|bytes| bytes.to_vec()).collect();
2118
2119 let dependencies = value
2120 .dependencies
2121 .iter()
2122 .map(|s| s.parse())
2123 .collect::<Result<_, _>>()
2124 .map_err(|e| TryFromProtoError::invalid(Publish::DEPENDENCIES_FIELD, e))?;
2125
2126 Ok(Self {
2127 modules,
2128 dependencies,
2129 })
2130 }
2131}
2132
2133impl From<sui_sdk_types::MakeMoveVector> for MakeMoveVector {
2138 fn from(value: sui_sdk_types::MakeMoveVector) -> Self {
2139 Self {
2140 element_type: value.type_.map(|t| t.to_string()),
2141 elements: value.elements.into_iter().map(Into::into).collect(),
2142 }
2143 }
2144}
2145
2146impl TryFrom<&MakeMoveVector> for sui_sdk_types::MakeMoveVector {
2147 type Error = TryFromProtoError;
2148
2149 fn try_from(value: &MakeMoveVector) -> Result<Self, Self::Error> {
2150 let element_type = value
2151 .element_type
2152 .as_ref()
2153 .map(|t| {
2154 t.parse()
2155 .map_err(|e| TryFromProtoError::invalid(MakeMoveVector::ELEMENT_TYPE_FIELD, e))
2156 })
2157 .transpose()?;
2158
2159 let elements = value
2160 .elements
2161 .iter()
2162 .map(TryInto::try_into)
2163 .collect::<Result<_, _>>()?;
2164
2165 Ok(Self {
2166 type_: element_type,
2167 elements,
2168 })
2169 }
2170}
2171
2172impl From<sui_sdk_types::Upgrade> for Upgrade {
2177 fn from(value: sui_sdk_types::Upgrade) -> Self {
2178 Self {
2179 modules: value.modules.into_iter().map(Into::into).collect(),
2180 dependencies: value.dependencies.iter().map(ToString::to_string).collect(),
2181 package: Some(value.package.to_string()),
2182 ticket: Some(value.ticket.into()),
2183 }
2184 }
2185}
2186
2187impl TryFrom<&Upgrade> for sui_sdk_types::Upgrade {
2188 type Error = TryFromProtoError;
2189
2190 fn try_from(value: &Upgrade) -> Result<Self, Self::Error> {
2191 let modules = value.modules.iter().map(|bytes| bytes.to_vec()).collect();
2192
2193 let dependencies = value
2194 .dependencies
2195 .iter()
2196 .map(|s| s.parse())
2197 .collect::<Result<_, _>>()
2198 .map_err(|e| TryFromProtoError::invalid(Upgrade::DEPENDENCIES_FIELD, e))?;
2199
2200 let package = value
2201 .package
2202 .as_ref()
2203 .ok_or_else(|| TryFromProtoError::missing("package"))?
2204 .parse()
2205 .map_err(|e| TryFromProtoError::invalid(Upgrade::PACKAGE_FIELD, e))?;
2206
2207 let ticket = value
2208 .ticket
2209 .as_ref()
2210 .ok_or_else(|| TryFromProtoError::missing("ticket"))?
2211 .try_into()?;
2212
2213 Ok(Self {
2214 modules,
2215 dependencies,
2216 package,
2217 ticket,
2218 })
2219 }
2220}