casper_types/execution/
transform.rs

1use 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/// A transformation performed while executing a deploy.
17#[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    /// Constructs a new `Transform`.
28    pub fn new(key: Key, kind: TransformKindV2) -> Self {
29        TransformV2 { key, kind }
30    }
31
32    /// Returns the key whose value was transformed.
33    pub fn key(&self) -> &Key {
34        &self.key
35    }
36
37    /// Returns the transformation kind.
38    pub fn kind(&self) -> &TransformKindV2 {
39        &self.kind
40    }
41
42    /// Consumes `self`, returning its constituent parts.
43    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}