Skip to main content

drive/state_transition_action/batch/batched_transition/
mod.rs

1use derive_more::From;
2use dpp::identifier::Identifier;
3use dpp::ProtocolError;
4use crate::state_transition_action::batch::batched_transition::document_transition::document_base_transition_action::DocumentBaseTransitionActionAccessorsV0;
5use crate::state_transition_action::batch::batched_transition::document_transition::DocumentTransitionAction;
6use crate::state_transition_action::batch::batched_transition::token_transition::token_base_transition_action::TokenBaseTransitionActionAccessorsV0;
7use crate::state_transition_action::batch::batched_transition::token_transition::TokenTransitionAction;
8use crate::state_transition_action::system::bump_identity_data_contract_nonce_action::{BumpIdentityDataContractNonceAction, BumpIdentityDataContractNonceActionAccessorsV0};
9
10/// document transition
11pub mod document_transition;
12/// token transition
13pub mod token_transition;
14
15/// token action
16// A short-lived value of one state transition's processing, like the document action it
17// holds
18#[allow(clippy::large_enum_variant)]
19#[derive(Debug, Clone, From)]
20pub enum BatchedTransitionAction {
21    /// document
22    DocumentAction(DocumentTransitionAction),
23    /// token
24    TokenAction(TokenTransitionAction),
25    /// bump identity data contract nonce
26    BumpIdentityDataContractNonce(BumpIdentityDataContractNonceAction),
27}
28
29impl BatchedTransitionAction {
30    /// Helper method to get the data contract id
31    pub fn data_contract_id(&self) -> Identifier {
32        match self {
33            BatchedTransitionAction::DocumentAction(document_action) => {
34                document_action.base().data_contract_id()
35            }
36            BatchedTransitionAction::TokenAction(token_action) => {
37                token_action.base().data_contract_id()
38            }
39            BatchedTransitionAction::BumpIdentityDataContractNonce(bump_action) => {
40                bump_action.data_contract_id()
41            }
42        }
43    }
44    /// as_document_action
45    pub fn as_document_action(&self) -> Result<&DocumentTransitionAction, ProtocolError> {
46        match self {
47            BatchedTransitionAction::DocumentAction(action) => Ok(action),
48            other => Err(ProtocolError::InvalidBatchedTransitionActionVariant {
49                expected: "DocumentAction",
50                found: other.variant_name(),
51            }),
52        }
53    }
54
55    /// as_token_action
56    pub fn as_token_action(&self) -> Result<&TokenTransitionAction, ProtocolError> {
57        match self {
58            BatchedTransitionAction::TokenAction(action) => Ok(action),
59            other => Err(ProtocolError::InvalidBatchedTransitionActionVariant {
60                expected: "TokenAction",
61                found: other.variant_name(),
62            }),
63        }
64    }
65
66    /// as_bump_identity_nonce_action
67    pub fn as_bump_identity_nonce_action(
68        &self,
69    ) -> Result<&BumpIdentityDataContractNonceAction, ProtocolError> {
70        match self {
71            BatchedTransitionAction::BumpIdentityDataContractNonce(action) => Ok(action),
72            other => Err(ProtocolError::InvalidBatchedTransitionActionVariant {
73                expected: "BumpIdentityDataContractNonce",
74                found: other.variant_name(),
75            }),
76        }
77    }
78
79    /// Helper method to get the variant name for diagnostics.
80    fn variant_name(&self) -> &'static str {
81        match self {
82            BatchedTransitionAction::DocumentAction(_) => "DocumentAction",
83            BatchedTransitionAction::TokenAction(_) => "TokenAction",
84            BatchedTransitionAction::BumpIdentityDataContractNonce(_) => {
85                "BumpIdentityDataContractNonce"
86            }
87        }
88    }
89}