use solana_account::{Account, AccountSharedData, ReadableAccount, WritableAccount};
use solana_pubkey::Pubkey;
use super::KeyedAccountSharedData;
use crate::protos::{acct_state::DataRepr, AcctState};
impl From<&AcctState> for AccountSharedData {
fn from(input: &AcctState) -> Self {
let mut account_data = AccountSharedData::default();
account_data.set_lamports(input.lamports);
account_data.set_data_from_slice(input.data());
account_data.set_owner(Pubkey::new_from_array(
input.owner.clone().try_into().unwrap(),
));
account_data.set_executable(input.executable);
account_data.set_rent_epoch(u64::MAX);
account_data
}
}
impl From<AcctState> for (Pubkey, Account) {
fn from(input: AcctState) -> Self {
let pubkey = Pubkey::new_from_array(input.address.try_into().unwrap());
let owner = Pubkey::new_from_array(input.owner.try_into().unwrap());
(
pubkey,
Account {
lamports: input.lamports,
data: match input.data_repr {
Some(DataRepr::Data(data)) => data,
_ => Vec::new(),
},
owner,
executable: input.executable,
rent_epoch: u64::MAX,
},
)
}
}
impl From<KeyedAccountSharedData> for AcctState {
fn from(value: KeyedAccountSharedData) -> AcctState {
AcctState {
address: value.0.to_bytes().to_vec(),
lamports: value.1.lamports(),
data_repr: Some(DataRepr::Data(value.1.data().to_vec())),
executable: value.1.executable(),
owner: value.1.owner().to_bytes().to_vec(),
}
}
}