casper_types/execution/
effects.rs1use 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#[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 pub const fn new() -> Self {
25 Effects(vec![])
26 }
27
28 pub fn transforms(&self) -> &[TransformV2] {
30 &self.0
31 }
32
33 pub fn push(&mut self, transform: TransformV2) {
35 self.0.push(transform)
36 }
37
38 pub fn append(&mut self, mut other: Self) {
40 self.0.append(&mut other.0);
41 }
42
43 pub fn is_empty(&self) -> bool {
45 self.0.is_empty()
46 }
47
48 pub fn len(&self) -> usize {
50 self.0.len()
51 }
52
53 pub fn value(self) -> Vec<TransformV2> {
55 self.0
56 }
57
58 #[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}