catbuffer_rust/metadata_entry_builder.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 super::address_dto::*;
23use super::generator_utils::*;
24use super::metadata_type_dto::*;
25use super::metadata_value_builder::*;
26use super::scoped_metadata_key_dto::*;
27use super::state_header_builder::*;
28
29/// Binary layout of a metadata entry.
30#[derive(Debug, Clone)]
31pub struct MetadataEntryBuilder {
32 /// State header.
33 super_object: StateHeaderBuilder,
34 /// Metadata source address (provider).
35 source_address: AddressDto,
36 /// Metadata target address.
37 target_address: AddressDto,
38 /// Metadata key scoped to source, target and type.
39 scoped_metadata_key: ScopedMetadataKeyDto,
40 /// Target id.
41 target_id: u64,
42 /// Metadata type.
43 metadata_type: MetadataTypeDto,
44 /// Value.
45 value: MetadataValueBuilder,
46}
47
48
49impl MetadataEntryBuilder {
50 /// Creates an instance of MetadataEntryBuilder from binary payload.
51 /// payload: Byte payload to use to serialize the object.
52 /// # Returns
53 /// A MetadataEntryBuilder.
54 pub fn from_binary(_bytes: &[u8]) -> Self {
55 let super_object = StateHeaderBuilder::from_binary(_bytes);
56 let mut _bytes = _bytes[super_object.get_size()..].to_vec();
57 let source_address = AddressDto::from_binary(&_bytes); // kind:CUSTOM1
58 let mut _bytes = _bytes[source_address.get_size()..].to_vec();
59 let target_address = AddressDto::from_binary(&_bytes); // kind:CUSTOM1
60 let mut _bytes = _bytes[target_address.get_size()..].to_vec();
61 let scoped_metadata_key = ScopedMetadataKeyDto::from_binary(&_bytes); // kind:CUSTOM1
62 let mut _bytes = _bytes[scoped_metadata_key.get_size()..].to_vec();
63 let buf = fixed_bytes::<8>(&_bytes);
64 let target_id = u64::from_le_bytes(buf); // kind:SIMPLE
65 let _bytes = (&_bytes[8..]).to_vec();
66 let metadata_type = MetadataTypeDto::from_binary(&_bytes); // kind:CUSTOM2
67 let mut _bytes = _bytes[metadata_type.get_size()..].to_vec();
68 let value = MetadataValueBuilder::from_binary(&_bytes); // kind:CUSTOM1
69 let mut _bytes = _bytes[value.get_size()..].to_vec();
70 MetadataEntryBuilder { super_object, source_address, target_address, scoped_metadata_key, target_id, metadata_type, value }
71 }
72
73 /// Gets metadata source address (provider).
74 ///
75 /// # Returns
76 /// A Metadata source address (provider).
77 pub fn get_source_address(&self) -> AddressDto {
78 self.source_address.clone()
79 }
80
81 /// Gets metadata target address.
82 ///
83 /// # Returns
84 /// A Metadata target address.
85 pub fn get_target_address(&self) -> AddressDto {
86 self.target_address.clone()
87 }
88
89 /// Gets metadata key scoped to source, target and type.
90 ///
91 /// # Returns
92 /// A Metadata key scoped to source, target and type.
93 pub fn get_scoped_metadata_key(&self) -> ScopedMetadataKeyDto {
94 self.scoped_metadata_key.clone()
95 }
96
97 /// Gets target id.
98 ///
99 /// # Returns
100 /// A Target id.
101 pub fn get_target_id(&self) -> u64 {
102 self.target_id.clone()
103 }
104
105 /// Gets metadata type.
106 ///
107 /// # Returns
108 /// A Metadata type.
109 pub fn get_metadata_type(&self) -> MetadataTypeDto {
110 self.metadata_type.clone()
111 }
112
113 /// Gets value.
114 ///
115 /// # Returns
116 /// A Value.
117 pub fn get_value(&self) -> MetadataValueBuilder {
118 self.value.clone()
119 }
120
121 /// Gets the size of the type.
122 ///
123 /// Returns:
124 /// A size in bytes.
125 pub fn get_size(&self) -> usize {
126 let mut size = self.super_object.get_size();
127 size += self.source_address.get_size(); // source_address;
128 size += self.target_address.get_size(); // target_address;
129 size += self.scoped_metadata_key.get_size(); // scoped_metadata_key;
130 size += 8; // target_id;
131 size += self.metadata_type.get_size(); // metadata_type;
132 size += self.value.get_size(); // value;
133 size
134 }
135
136 /// Serializes self to bytes.
137 ///
138 /// # Returns
139 /// A Serialized bytes.
140 pub fn serializer(&self) -> Vec<u8> {
141 let mut buf: Vec<u8> = vec![];
142 buf.append(&mut self.super_object.serializer());
143 buf.append(&mut self.source_address.serializer()); // kind:CUSTOM
144 buf.append(&mut self.target_address.serializer()); // kind:CUSTOM
145 buf.append(&mut self.scoped_metadata_key.serializer()); // kind:CUSTOM
146 buf.append(&mut self.get_target_id().to_le_bytes().to_vec()); // kind:SIMPLE
147 buf.append(&mut self.metadata_type.serializer()); // kind:CUSTOM
148 buf.append(&mut self.value.serializer()); // kind:CUSTOM
149 buf
150 }
151}
152