catbuffer_rust/
embedded_transaction_helper.rs

1/*
2 * // Copyright (c) 2016-2019, Jaguar0625, gimre, BloodyRookie, Tech Bureau, Corp.
3 * // Copyright (c) 2020-present, Jaguar0625, gimre, BloodyRookie.
4 * // All rights reserved.
5 * //
6 * // This file is part of Catapult.
7 * //
8 * // Catapult is free software: you can redistribute it and/or modify
9 * // it under the terms of the GNU Lesser General Public License as published by
10 * // the Free Software Foundation, either version 3 of the License, or
11 * // (at your option) any later version.
12 * //
13 * // Catapult is distributed in the hope that it will be useful,
14 * // but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * // GNU Lesser General Public License for more details.
17 * //
18 * // You should have received a copy of the GNU Lesser General Public License
19 * // along with Catapult. If not, see <http://www.gnu.org/licenses/>.
20 */
21
22use std::fmt::Debug;
23
24use crate::embedded_transaction_builder::EmbeddedTransactionBuilder;
25
26use super::embedded_account_address_restriction_transaction_builder::EmbeddedAccountAddressRestrictionTransactionBuilder;
27use super::embedded_account_key_link_transaction_builder::EmbeddedAccountKeyLinkTransactionBuilder;
28use super::embedded_account_metadata_transaction_builder::EmbeddedAccountMetadataTransactionBuilder;
29use super::embedded_account_mosaic_restriction_transaction_builder::EmbeddedAccountMosaicRestrictionTransactionBuilder;
30use super::embedded_account_operation_restriction_transaction_builder::EmbeddedAccountOperationRestrictionTransactionBuilder;
31use super::embedded_address_alias_transaction_builder::EmbeddedAddressAliasTransactionBuilder;
32use super::embedded_hash_lock_transaction_builder::EmbeddedHashLockTransactionBuilder;
33use super::embedded_mosaic_address_restriction_transaction_builder::EmbeddedMosaicAddressRestrictionTransactionBuilder;
34use super::embedded_mosaic_alias_transaction_builder::EmbeddedMosaicAliasTransactionBuilder;
35use super::embedded_mosaic_definition_transaction_builder::EmbeddedMosaicDefinitionTransactionBuilder;
36use super::embedded_mosaic_global_restriction_transaction_builder::EmbeddedMosaicGlobalRestrictionTransactionBuilder;
37use super::embedded_mosaic_metadata_transaction_builder::EmbeddedMosaicMetadataTransactionBuilder;
38use super::embedded_mosaic_supply_change_transaction_builder::EmbeddedMosaicSupplyChangeTransactionBuilder;
39use super::embedded_multisig_account_modification_transaction_builder::EmbeddedMultisigAccountModificationTransactionBuilder;
40use super::embedded_namespace_metadata_transaction_builder::EmbeddedNamespaceMetadataTransactionBuilder;
41use super::embedded_namespace_registration_transaction_builder::EmbeddedNamespaceRegistrationTransactionBuilder;
42use super::embedded_node_key_link_transaction_builder::EmbeddedNodeKeyLinkTransactionBuilder;
43use super::embedded_secret_lock_transaction_builder::EmbeddedSecretLockTransactionBuilder;
44use super::embedded_secret_proof_transaction_builder::EmbeddedSecretProofTransactionBuilder;
45use super::embedded_transfer_transaction_builder::EmbeddedTransferTransactionBuilder;
46use super::embedded_voting_key_link_transaction_builder::EmbeddedVotingKeyLinkTransactionBuilder;
47use super::embedded_vrf_key_link_transaction_builder::EmbeddedVrfKeyLinkTransactionBuilder;
48
49/// Helper trait for embedded transaction serialization.
50pub trait EmbeddedTransactionHelper: Debug + Send + Sync {
51    fn box_clone(&self) -> Box<dyn EmbeddedTransactionHelper>;
52    fn get_size(&self) -> usize;
53    fn serializer(&self) -> Vec<u8>;
54}
55
56impl Clone for Box<dyn EmbeddedTransactionHelper + 'static> {
57    fn clone(&self) -> Box<dyn EmbeddedTransactionHelper + 'static> {
58        self.box_clone()
59    }
60}
61
62pub fn load_from_binary(payload: &[u8]) -> Box<dyn EmbeddedTransactionHelper> {
63    let header_builder = EmbeddedTransactionBuilder::from_binary(payload);
64    let entity_type_version = header_builder.version;
65    match header_builder._type.get_value() {
66        0x414c if entity_type_version == 1 => Box::new(EmbeddedAccountKeyLinkTransactionBuilder::from_binary(payload)),
67        0x424c if entity_type_version == 1 => Box::new(EmbeddedNodeKeyLinkTransactionBuilder::from_binary(payload)),
68        0x4143 if entity_type_version == 1 => Box::new(EmbeddedVotingKeyLinkTransactionBuilder::from_binary(payload)),
69        0x4243 if entity_type_version == 1 => Box::new(EmbeddedVrfKeyLinkTransactionBuilder::from_binary(payload)),
70        0x4148 if entity_type_version == 1 => Box::new(EmbeddedHashLockTransactionBuilder::from_binary(payload)),
71        0x4152 if entity_type_version == 1 => Box::new(EmbeddedSecretLockTransactionBuilder::from_binary(payload)),
72        0x4252 if entity_type_version == 1 => Box::new(EmbeddedSecretProofTransactionBuilder::from_binary(payload)),
73        0x4144 if entity_type_version == 1 => Box::new(EmbeddedAccountMetadataTransactionBuilder::from_binary(payload)),
74        0x4244 if entity_type_version == 1 => Box::new(EmbeddedMosaicMetadataTransactionBuilder::from_binary(payload)),
75        0x4344 if entity_type_version == 1 => Box::new(EmbeddedNamespaceMetadataTransactionBuilder::from_binary(payload)),
76        0x414d if entity_type_version == 1 => Box::new(EmbeddedMosaicDefinitionTransactionBuilder::from_binary(payload)),
77        0x424d if entity_type_version == 1 => Box::new(EmbeddedMosaicSupplyChangeTransactionBuilder::from_binary(payload)),
78        0x4155 if entity_type_version == 1 => Box::new(EmbeddedMultisigAccountModificationTransactionBuilder::from_binary(payload)),
79        0x424e if entity_type_version == 1 => Box::new(EmbeddedAddressAliasTransactionBuilder::from_binary(payload)),
80        0x434e if entity_type_version == 1 => Box::new(EmbeddedMosaicAliasTransactionBuilder::from_binary(payload)),
81        0x414e if entity_type_version == 1 => Box::new(EmbeddedNamespaceRegistrationTransactionBuilder::from_binary(payload)),
82        0x4150 if entity_type_version == 1 => Box::new(EmbeddedAccountAddressRestrictionTransactionBuilder::from_binary(payload)),
83        0x4250 if entity_type_version == 1 => Box::new(EmbeddedAccountMosaicRestrictionTransactionBuilder::from_binary(payload)),
84        0x4350 if entity_type_version == 1 => Box::new(EmbeddedAccountOperationRestrictionTransactionBuilder::from_binary(payload)),
85        0x4251 if entity_type_version == 1 => Box::new(EmbeddedMosaicAddressRestrictionTransactionBuilder::from_binary(payload)),
86        0x4151 if entity_type_version == 1 => Box::new(EmbeddedMosaicGlobalRestrictionTransactionBuilder::from_binary(payload)),
87        0x4154 if entity_type_version == 1 => Box::new(EmbeddedTransferTransactionBuilder::from_binary(payload)),
88        _ => panic!()
89    }
90}