mod pool;
use crate::{Node, NodeId};
use async_trait::async_trait;
use error_stack::Result;
use mockall::automock;
pub use pool::ClientsPool;
use std::net::SocketAddr;
use thiserror::Error;
#[automock]
#[async_trait]
pub trait Client {
async fn init(addr: SocketAddr) -> Self;
async fn find_successor(&self, id: NodeId) -> Result<Node, ClientError>;
async fn successor(&self) -> Result<Node, ClientError>;
async fn successor_list(&self) -> Result<Vec<Node>, ClientError>;
async fn predecessor(&self) -> Result<Option<Node>, ClientError>;
async fn notify(&self, predecessor: Node) -> Result<(), ClientError>;
async fn ping(&self) -> Result<(), ClientError>;
}
#[derive(Debug, Clone, Error)]
pub enum ClientError {
#[error("{0}")]
ConnectionFailed(String),
#[error("Invalid request: {0}")]
InvalidRequest(String),
#[error("Client not initialized")]
NotInitialized,
#[error("Unexpected error")]
Unexpected,
#[error("Ping failed")]
PingFailed,
#[error("Find successor failed")]
FindSuccessorFailed,
#[error("Get successor failed")]
GetSuccessorFailed,
#[error("Get successor list failed")]
GetSuccessorListFailed,
#[error("Get predecessor failed")]
GetPredecessorFailed,
#[error("Notify failed")]
NotifyFailed,
}
#[cfg(test)]
impl Clone for MockClient {
fn clone(&self) -> Self {
Self::default()
}
}