2019-03-03 13:17:51 -08:00
|
|
|
//! budget state
|
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};
|
|
|
|
use solana_budget_api::budget_expr::BudgetExpr;
|
|
|
|
|
|
|
|
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
|
|
|
|
pub enum BudgetError {
|
|
|
|
InsufficientFunds,
|
|
|
|
ContractAlreadyExists,
|
|
|
|
ContractNotPending,
|
|
|
|
SourceIsPendingContract,
|
|
|
|
UninitializedContract,
|
|
|
|
NegativeTokens,
|
|
|
|
DestinationMissing,
|
|
|
|
FailedWitness,
|
|
|
|
UserdataTooSmall,
|
|
|
|
UserdataDeserializeFailure,
|
|
|
|
UnsignedKey,
|
|
|
|
}
|
|
|
|
|
|
|
|
#[derive(Serialize, Deserialize, Debug, Clone, Default, PartialEq)]
|
|
|
|
pub struct BudgetState {
|
|
|
|
pub initialized: bool,
|
|
|
|
pub pending_budget: Option<BudgetExpr>,
|
|
|
|
}
|
|
|
|
|
|
|
|
impl BudgetState {
|
|
|
|
pub fn is_pending(&self) -> bool {
|
|
|
|
self.pending_budget.is_some()
|
|
|
|
}
|
|
|
|
|
|
|
|
pub fn serialize(&self, output: &mut [u8]) -> Result<(), BudgetError> {
|
2019-03-03 14:09:29 -08:00
|
|
|
serialize_into(output, self).map_err(|err| match *err {
|
|
|
|
_ => BudgetError::UserdataTooSmall,
|
|
|
|
})
|
2019-03-03 13:17:51 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
pub fn deserialize(input: &[u8]) -> bincode::Result<Self> {
|
2019-03-03 14:09:29 -08:00
|
|
|
deserialize(input)
|
2019-03-03 13:17:51 -08:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#[cfg(test)]
|
|
|
|
mod test {
|
|
|
|
use super::*;
|
|
|
|
use solana_budget_api::id;
|
|
|
|
use solana_sdk::account::Account;
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_serializer() {
|
|
|
|
let mut a = Account::new(0, 512, id());
|
|
|
|
let b = BudgetState::default();
|
|
|
|
b.serialize(&mut a.userdata).unwrap();
|
|
|
|
let c = BudgetState::deserialize(&a.userdata).unwrap();
|
|
|
|
assert_eq!(b, c);
|
|
|
|
}
|
|
|
|
|
|
|
|
#[test]
|
|
|
|
fn test_serializer_userdata_too_small() {
|
|
|
|
let mut a = Account::new(0, 1, id());
|
|
|
|
let b = BudgetState::default();
|
|
|
|
assert_eq!(
|
|
|
|
b.serialize(&mut a.userdata),
|
|
|
|
Err(BudgetError::UserdataTooSmall)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|