2019-03-03 13:17:51 -08:00
|
|
|
//! budget state
|
2019-03-03 14:43:51 -08:00
|
|
|
use crate::budget_expr::BudgetExpr;
|
2019-03-03 14:09:29 -08:00
|
|
|
use bincode::{self, deserialize, serialize_into};
|
2019-03-03 13:17:51 -08:00
|
|
|
use serde_derive::{Deserialize, Serialize};
|
2019-03-15 15:10:00 -07:00
|
|
|
use solana_sdk::native_program::ProgramError;
|
2019-03-03 13:17:51 -08:00
|
|
|
|
|
|
|
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
|
|
|
pub enum BudgetError {
|
|
|
|
DestinationMissing,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Serialize, Deserialize, Debug, Clone, Default, PartialEq)]
|
|
|
|
pub struct BudgetState {
|
|
|
|
pub initialized: bool,
|
|
|
|
pub pending_budget: Option<BudgetExpr>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl BudgetState {
|
2019-03-03 14:43:51 -08:00
|
|
|
pub fn new(budget_expr: BudgetExpr) -> Self {
|
|
|
|
Self {
|
|
|
|
initialized: true,
|
|
|
|
pending_budget: Some(budget_expr),
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-03-03 13:17:51 -08:00
|
|
|
pub fn is_pending(&self) -> bool {
|
|
|
|
self.pending_budget.is_some()
|
|
|
|
}
|
|
|
|
|
2019-03-15 15:10:00 -07:00
|
|
|
pub fn serialize(&self, output: &mut [u8]) -> Result<(), ProgramError> {
|
|
|
|
serialize_into(output, self).map_err(|_| ProgramError::AccountDataTooSmall)
|
2019-03-03 13:17:51 -08:00
|
|
|
}
|
|
|
|
|
2019-03-15 15:10:00 -07:00
|
|
|
pub fn deserialize(input: &[u8]) -> Result<Self, ProgramError> {
|
|
|
|
deserialize(input).map_err(|_| ProgramError::InvalidAccountData)
|
2019-03-03 13:17:51 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
mod test {
|
|
|
|
use super::*;
|
2019-03-03 14:43:51 -08:00
|
|
|
use crate::id;
|
2019-03-03 13:17:51 -08:00
|
|
|
use solana_sdk::account::Account;
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_serializer() {
|
2019-03-09 19:28:43 -08:00
|
|
|
let mut a = Account::new(0, 512, &id());
|
2019-03-03 13:17:51 -08:00
|
|
|
let b = BudgetState::default();
|
2019-03-14 09:48:27 -07:00
|
|
|
b.serialize(&mut a.data).unwrap();
|
|
|
|
let c = BudgetState::deserialize(&a.data).unwrap();
|
2019-03-03 13:17:51 -08:00
|
|
|
assert_eq!(b, c);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
2019-03-14 09:48:27 -07:00
|
|
|
fn test_serializer_data_too_small() {
|
2019-03-09 19:28:43 -08:00
|
|
|
let mut a = Account::new(0, 1, &id());
|
2019-03-03 13:17:51 -08:00
|
|
|
let b = BudgetState::default();
|
|
|
|
assert_eq!(
|
2019-03-14 09:48:27 -07:00
|
|
|
b.serialize(&mut a.data),
|
2019-03-15 15:10:00 -07:00
|
|
|
Err(ProgramError::AccountDataTooSmall)
|
2019-03-03 13:17:51 -08:00
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|