casper_types/execution/
effects.rs

1use alloc::vec::Vec;
2
3#[cfg(feature = "datasize")]
4use datasize::DataSize;
5#[cfg(any(feature = "testing", test))]
6use rand::Rng;
7#[cfg(feature = "json-schema")]
8use schemars::JsonSchema;
9use serde::{Deserialize, Serialize};
10
11#[cfg(any(feature = "testing", test))]
12use super::TransformKindV2;
13use super::TransformV2;
14use crate::bytesrepr::{self, FromBytes, ToBytes};
15
16/// A log of all transforms produced during execution.
17#[derive(Debug, Clone, Eq, Default, PartialEq, Serialize, Deserialize)]
18#[cfg_attr(feature = "datasize", derive(DataSize))]
19#[cfg_attr(feature = "json-schema", derive(JsonSchema))]
20pub struct Effects(Vec<TransformV2>);
21
22impl Effects {
23    /// Constructs a new, empty `Effects`.
24    pub const fn new() -> Self {
25        Effects(vec![])
26    }
27
28    /// Returns a reference to the transforms.
29    pub fn transforms(&self) -> &[TransformV2] {
30        &self.0
31    }
32
33    /// Appends a transform.
34    pub fn push(&mut self, transform: TransformV2) {
35        self.0.push(transform)
36    }
37
38    /// Moves all elements from `other` into `self`.
39    pub fn append(&mut self, mut other: Self) {
40        self.0.append(&mut other.0);
41    }
42
43    /// Returns `true` if there are no transforms recorded.
44    pub fn is_empty(&self) -> bool {
45        self.0.is_empty()
46    }
47
48    /// Returns the number of transforms recorded.
49    pub fn len(&self) -> usize {
50        self.0.len()
51    }
52
53    /// Consumes `self`, returning the wrapped vec.
54    pub fn value(self) -> Vec<TransformV2> {
55        self.0
56    }
57
58    /// Returns a random `Effects`.
59    #[cfg(any(feature = "testing", test))]
60    pub fn random<R: Rng + ?Sized>(rng: &mut R) -> Self {
61        let mut effects = Effects::new();
62        let transform_count = rng.gen_range(0..6);
63        for _ in 0..transform_count {
64            effects.push(TransformV2::new(rng.gen(), TransformKindV2::random(rng)));
65        }
66        effects
67    }
68}
69
70impl ToBytes for Effects {
71    fn write_bytes(&self, writer: &mut Vec<u8>) -> Result<(), bytesrepr::Error> {
72        self.0.write_bytes(writer)
73    }
74
75    fn to_bytes(&self) -> Result<Vec<u8>, bytesrepr::Error> {
76        let mut buffer = bytesrepr::allocate_buffer(self)?;
77        self.write_bytes(&mut buffer)?;
78        Ok(buffer)
79    }
80
81    fn serialized_length(&self) -> usize {
82        self.0.serialized_length()
83    }
84}
85
86impl FromBytes for Effects {
87    fn from_bytes(bytes: &[u8]) -> Result<(Self, &[u8]), bytesrepr::Error> {
88        let (transforms, remainder) = Vec::<TransformV2>::from_bytes(bytes)?;
89        Ok((Effects(transforms), remainder))
90    }
91}
92
93#[cfg(test)]
94mod tests {
95    use crate::testing::TestRng;
96
97    use super::*;
98
99    #[test]
100    fn bytesrepr_roundtrip() {
101        let rng = &mut TestRng::new();
102        let effects = Effects::random(rng);
103        bytesrepr::test_serialization_roundtrip(&effects);
104    }
105}