casper_types/execution/
transform.rs1use alloc::vec::Vec;
2
3#[cfg(feature = "datasize")]
4use datasize::DataSize;
5#[cfg(feature = "json-schema")]
6use schemars::JsonSchema;
7use serde::{Deserialize, Serialize};
8use tracing::error;
9
10use super::TransformKindV2;
11use crate::{
12 bytesrepr::{self, FromBytes, ToBytes},
13 Key,
14};
15
16#[derive(Clone, Eq, PartialEq, Serialize, Deserialize, Debug)]
18#[cfg_attr(feature = "datasize", derive(DataSize))]
19#[cfg_attr(feature = "json-schema", derive(JsonSchema))]
20#[serde(deny_unknown_fields)]
21pub struct TransformV2 {
22 key: Key,
23 kind: TransformKindV2,
24}
25
26impl TransformV2 {
27 pub fn new(key: Key, kind: TransformKindV2) -> Self {
29 TransformV2 { key, kind }
30 }
31
32 pub fn key(&self) -> &Key {
34 &self.key
35 }
36
37 pub fn kind(&self) -> &TransformKindV2 {
39 &self.kind
40 }
41
42 pub fn destructure(self) -> (Key, TransformKindV2) {
44 (self.key, self.kind)
45 }
46}
47
48impl ToBytes for TransformV2 {
49 fn to_bytes(&self) -> Result<Vec<u8>, bytesrepr::Error> {
50 let mut buffer = bytesrepr::allocate_buffer(self)?;
51 self.write_bytes(&mut buffer)?;
52 Ok(buffer)
53 }
54
55 fn serialized_length(&self) -> usize {
56 self.key.serialized_length() + self.kind.serialized_length()
57 }
58
59 fn write_bytes(&self, writer: &mut Vec<u8>) -> Result<(), bytesrepr::Error> {
60 self.key.write_bytes(writer)?;
61 if let Err(err) = self.kind.write_bytes(writer) {
62 error!(%err, "ToBytes for TransformV2");
63 Err(err)
64 } else {
65 Ok(())
66 }
67 }
68}
69
70impl FromBytes for TransformV2 {
71 fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), bytesrepr::Error> {
72 let (key, remainder) = match Key::from_bytes(bytes) {
73 Ok((k, rem)) => (k, rem),
74 Err(err) => {
75 error!(%err, "FromBytes for TransformV2: key");
76 return Err(err);
77 }
78 };
79 let (transform, remainder) = match TransformKindV2::from_bytes(remainder) {
80 Ok((tk, rem)) => (tk, rem),
81 Err(err) => {
82 error!(%err, "FromBytes for TransformV2: transform");
83 return Err(err);
84 }
85 };
86 let transform_entry = TransformV2 {
87 key,
88 kind: transform,
89 };
90 Ok((transform_entry, remainder))
91 }
92}