use super::*;
impl<N: Network> FromBytes for ConfirmedTransaction<N> {
fn read_le<R: Read>(mut reader: R) -> IoResult<Self> {
let variant = u8::read_le(&mut reader)?;
match variant {
0 => {
let index = u32::read_le(&mut reader)?;
let transaction = Transaction::<N>::read_le(&mut reader)?;
let num_finalize = NumFinalizeSize::read_le(&mut reader)?;
if num_finalize as usize > N::MAX_COMMANDS {
return Err(error(format!(
"ConfirmedTransaction (from 'read_le') has too many finalize operations ({} > {})",
num_finalize,
N::MAX_COMMANDS
)));
}
let finalize =
(0..num_finalize).map(|_| FromBytes::read_le(&mut reader)).collect::<Result<Vec<_>, _>>()?;
Self::accepted_deploy(index, transaction, finalize).map_err(error)
}
1 => {
let index = u32::read_le(&mut reader)?;
let transaction = Transaction::<N>::read_le(&mut reader)?;
let num_finalize = NumFinalizeSize::read_le(&mut reader)?;
if num_finalize as usize > N::MAX_COMMANDS {
return Err(error(format!(
"ConfirmedTransaction (from 'read_le') has too many finalize operations ({} > {})",
num_finalize,
N::MAX_COMMANDS
)));
}
let finalize =
(0..num_finalize).map(|_| FromBytes::read_le(&mut reader)).collect::<Result<Vec<_>, _>>()?;
Self::accepted_execute(index, transaction, finalize).map_err(error)
}
2 => {
let index = u32::read_le(&mut reader)?;
let transaction = Transaction::<N>::read_le(&mut reader)?;
let rejected = Rejected::<N>::read_le(&mut reader)?;
let num_finalize = NumFinalizeSize::read_le(&mut reader)?;
if num_finalize as usize > N::MAX_COMMANDS {
return Err(error(format!(
"ConfirmedTransaction (from 'read_le') has too many finalize operations ({} > {})",
num_finalize,
N::MAX_COMMANDS
)));
}
let finalize =
(0..num_finalize).map(|_| FromBytes::read_le(&mut reader)).collect::<Result<Vec<_>, _>>()?;
Self::rejected_deploy(index, transaction, rejected, finalize).map_err(error)
}
3 => {
let index = u32::read_le(&mut reader)?;
let transaction = Transaction::<N>::read_le(&mut reader)?;
let rejected = Rejected::<N>::read_le(&mut reader)?;
let num_finalize = NumFinalizeSize::read_le(&mut reader)?;
if num_finalize as usize > N::MAX_COMMANDS {
return Err(error(format!(
"ConfirmedTransaction (from 'read_le') has too many finalize operations ({} > {})",
num_finalize,
N::MAX_COMMANDS
)));
}
let finalize =
(0..num_finalize).map(|_| FromBytes::read_le(&mut reader)).collect::<Result<Vec<_>, _>>()?;
Self::rejected_execute(index, transaction, rejected, finalize).map_err(error)
}
4.. => Err(error(format!("Failed to decode confirmed transaction variant {variant}"))),
}
}
}
impl<N: Network> ToBytes for ConfirmedTransaction<N> {
fn write_le<W: Write>(&self, mut writer: W) -> IoResult<()> {
match self {
Self::AcceptedDeploy(index, transaction, finalize) => {
0u8.write_le(&mut writer)?;
index.write_le(&mut writer)?;
transaction.write_le(&mut writer)?;
NumFinalizeSize::try_from(finalize.len()).map_err(error)?.write_le(&mut writer)?;
finalize.iter().try_for_each(|finalize| finalize.write_le(&mut writer))
}
Self::AcceptedExecute(index, transaction, finalize) => {
1u8.write_le(&mut writer)?;
index.write_le(&mut writer)?;
transaction.write_le(&mut writer)?;
NumFinalizeSize::try_from(finalize.len()).map_err(error)?.write_le(&mut writer)?;
finalize.iter().try_for_each(|finalize| finalize.write_le(&mut writer))
}
Self::RejectedDeploy(index, transaction, rejected, finalize) => {
2u8.write_le(&mut writer)?;
index.write_le(&mut writer)?;
transaction.write_le(&mut writer)?;
rejected.write_le(&mut writer)?;
NumFinalizeSize::try_from(finalize.len()).map_err(error)?.write_le(&mut writer)?;
finalize.iter().try_for_each(|finalize| finalize.write_le(&mut writer))
}
Self::RejectedExecute(index, transaction, rejected, finalize) => {
3u8.write_le(&mut writer)?;
index.write_le(&mut writer)?;
transaction.write_le(&mut writer)?;
rejected.write_le(&mut writer)?;
NumFinalizeSize::try_from(finalize.len()).map_err(error)?.write_le(&mut writer)?;
finalize.iter().try_for_each(|finalize| finalize.write_le(&mut writer))
}
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_bytes() {
for expected in crate::transactions::confirmed::test_helpers::sample_confirmed_transactions() {
let expected_bytes = expected.to_bytes_le().unwrap();
assert_eq!(expected, ConfirmedTransaction::read_le(&expected_bytes[..]).unwrap());
}
}
}