use crust::{PeerId, Service};
use error::RoutingError;
use evented::{Evented, ToEvented};
use id::FullId;
use maidsafe_utilities::serialisation;
use messages::Message;
use routing_table::Authority;
use state_machine::Transition;
use stats::Stats;
use std::fmt::Debug;
use xor_name::XorName;
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 handle_lost_peer(&mut self, _peer_id: PeerId) -> Evented<Transition> {
Transition::Stay.to_evented()
}
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, peer_id: &PeerId, message: Message) -> Result<(), RoutingError> {
let priority = message.priority();
let raw_bytes = match serialisation::serialise(&message) {
Err(error) => {
error!("{:?} Failed to serialise message {:?}: {:?}",
self,
message,
error);
return Err(error.into());
}
Ok(bytes) => bytes,
};
self.send_or_drop(peer_id, raw_bytes, priority);
Ok(())
}
fn send_or_drop(&mut self, peer_id: &PeerId, bytes: Vec<u8>, priority: u8) {
self.stats().count_bytes(bytes.len());
if let Err(err) = self.crust_service().send(*peer_id, bytes, priority) {
info!("{:?} Connection to {:?} failed: {:?}", self, peer_id, err);
}
}
}