use id::{FullId, PublicId};
use maidsafe_utilities::serialisation;
use messages::Message;
use outbox::EventBox;
use routing_table::Authority;
use state_machine::Transition;
use stats::Stats;
use std::fmt::Debug;
use xor_name::XorName;
use Service;
pub trait Base: Debug {
fn crust_service(&self) -> &Service;
fn full_id(&self) -> &FullId;
fn stats(&mut self) -> &mut Stats;
fn in_authority(&self, auth: &Authority<XorName>) -> bool;
fn min_section_size(&self) -> usize;
fn handle_lost_peer(&mut self, _pub_id: PublicId, _outbox: &mut EventBox) -> Transition {
Transition::Stay
}
fn id(&self) -> &PublicId {
self.full_id().public_id()
}
fn name(&self) -> &XorName {
self.full_id().public_id().name()
}
fn close_group(&self, _name: XorName, _count: usize) -> Option<Vec<XorName>> {
None
}
fn send_message(&mut self, pub_id: &PublicId, message: Message) {
let priority = message.priority();
match serialisation::serialise(&message) {
Ok(bytes) => {
self.send_or_drop(pub_id, bytes, priority);
}
Err(error) => {
error!(
"{:?} Failed to serialise message {:?}: {:?}",
self, message, error
);
}
};
}
fn send_or_drop(&mut self, pub_id: &PublicId, bytes: Vec<u8>, priority: u8) {
self.stats().count_bytes(bytes.len());
if let Err(err) = self.crust_service().send(pub_id, bytes, priority) {
info!("{:?} Connection to {} failed: {:?}", self, pub_id, err);
}
}
}