Simplify Budget's serialize

This commit is contained in:
Greg Fitzgerald
2019-03-03 15:09:29 -07:00
committed by Grimes
parent baca3e6b6b
commit 8ec10d4de9

View File

@ -1,9 +1,7 @@
//! budget state //! budget state
use bincode::{self, deserialize, serialize_into, serialized_size}; use bincode::{self, deserialize, serialize_into};
use log::*;
use serde_derive::{Deserialize, Serialize}; use serde_derive::{Deserialize, Serialize};
use solana_budget_api::budget_expr::BudgetExpr; use solana_budget_api::budget_expr::BudgetExpr;
use std::io;
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)] #[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub enum BudgetError { pub enum BudgetError {
@ -32,46 +30,19 @@ impl BudgetState {
} }
pub fn serialize(&self, output: &mut [u8]) -> Result<(), BudgetError> { pub fn serialize(&self, output: &mut [u8]) -> Result<(), BudgetError> {
let len = serialized_size(self).unwrap() as u64; serialize_into(output, self).map_err(|err| match *err {
if output.len() < len as usize { _ => BudgetError::UserdataTooSmall,
warn!( })
"{} bytes required to serialize, only have {} bytes",
len,
output.len()
);
return Err(BudgetError::UserdataTooSmall);
}
{
let writer = io::BufWriter::new(&mut output[..8]);
serialize_into(writer, &len).unwrap();
}
{
let writer = io::BufWriter::new(&mut output[8..8 + len as usize]);
serialize_into(writer, self).unwrap();
}
Ok(())
} }
pub fn deserialize(input: &[u8]) -> bincode::Result<Self> { pub fn deserialize(input: &[u8]) -> bincode::Result<Self> {
if input.len() < 8 { deserialize(input)
return Err(Box::new(bincode::ErrorKind::SizeLimit));
}
let len: u64 = deserialize(&input[..8]).unwrap();
if len < 2 {
return Err(Box::new(bincode::ErrorKind::SizeLimit));
}
if input.len() < 8 + len as usize {
return Err(Box::new(bincode::ErrorKind::SizeLimit));
}
deserialize(&input[8..8 + len as usize])
} }
} }
#[cfg(test)] #[cfg(test)]
mod test { mod test {
use super::*; use super::*;
use bincode::serialize;
use solana_budget_api::id; use solana_budget_api::id;
use solana_sdk::account::Account; use solana_sdk::account::Account;
@ -80,8 +51,6 @@ mod test {
let mut a = Account::new(0, 512, id()); let mut a = Account::new(0, 512, id());
let b = BudgetState::default(); let b = BudgetState::default();
b.serialize(&mut a.userdata).unwrap(); b.serialize(&mut a.userdata).unwrap();
let buf = serialize(&b).unwrap();
assert_eq!(a.userdata[8..8 + buf.len()], buf[0..]);
let c = BudgetState::deserialize(&a.userdata).unwrap(); let c = BudgetState::deserialize(&a.userdata).unwrap();
assert_eq!(b, c); assert_eq!(b, c);
} }