use rustc_serialize::{Decodable, Decoder};
use data_manager::{DataManagerSendable, DataManagerStatsSendable};
use maid_manager::MaidManagerAccountWrapper;
use pmid_manager::PmidManagerAccountWrapper;
pub mod transfer_tags {
pub const MAIDSAFE_TRANSFER_TAG: u64 = 5483_000 + 200;
pub const MAID_MANAGER_ACCOUNT_TAG: u64 = MAIDSAFE_TRANSFER_TAG + 1;
pub const DATA_MANAGER_ACCOUNT_TAG: u64 = MAIDSAFE_TRANSFER_TAG + 2;
pub const PMID_MANAGER_ACCOUNT_TAG: u64 = MAIDSAFE_TRANSFER_TAG + 3;
pub const SD_MANAGER_ACCOUNT_TAG: u64 = MAIDSAFE_TRANSFER_TAG + 4;
pub const DATA_MANAGER_STATS_TAG: u64 = MAIDSAFE_TRANSFER_TAG + 5;
}
pub enum Transfer {
MaidManagerAccount(MaidManagerAccountWrapper),
DataManagerAccount(DataManagerSendable),
PmidManagerAccount(PmidManagerAccountWrapper),
DataManagerStats(DataManagerStatsSendable),
Unknown(u64),
}
impl Decodable for Transfer {
fn decode<D: Decoder>(decoder: &mut D) -> Result<Transfer, D::Error> {
let tag = try!(decoder.read_u64());
match tag {
transfer_tags::MAID_MANAGER_ACCOUNT_TAG =>
Ok(Transfer::MaidManagerAccount(try!(Decodable::decode(decoder)))),
transfer_tags::DATA_MANAGER_ACCOUNT_TAG =>
Ok(Transfer::DataManagerAccount(try!(Decodable::decode(decoder)))),
transfer_tags::PMID_MANAGER_ACCOUNT_TAG =>
Ok(Transfer::PmidManagerAccount(try!(Decodable::decode(decoder)))),
transfer_tags::DATA_MANAGER_STATS_TAG =>
Ok(Transfer::DataManagerStats(try!(Decodable::decode(decoder)))),
transfer_tags::SD_MANAGER_ACCOUNT_TAG => Ok(Transfer::Unknown(tag)),
_ => Ok(Transfer::Unknown(tag)),
}
}
}