use std::net::SocketAddr;
use std::time::Duration;
use thiserror::Error;
use crate::error::{DataError, DbError, EncodingError, ParsingError};
pub trait PeerStorage {
fn store(&self, addr: SocketAddr) -> Result<bool, PeerStorageError>;
fn get(&self, count: usize) -> Result<Vec<SocketAddr>, PeerStorageError>;
fn get_since(&self, count: usize, when: Duration) -> Result<Vec<SocketAddr>, PeerStorageError>;
fn delete(&self, addr: SocketAddr) -> Result<(), PeerStorageError>;
fn on_connect_attempt(&self, addr: SocketAddr) -> Result<(), PeerStorageError>;
fn on_connect_success(&self, addr: SocketAddr) -> Result<(), PeerStorageError>;
fn on_connect_failure(&self, addr: SocketAddr) -> Result<(), PeerStorageError>;
fn on_disconnect(&self, addr: SocketAddr) -> Result<(), PeerStorageError>;
}
#[derive(Error, Debug)]
pub enum PeerStorageError {
#[error("data")]
Data(#[from] DataError),
#[error("db")]
Db(#[from] DbError),
#[error("encoding")]
Encoding(#[from] EncodingError),
#[error("parsing")]
Parsing(#[from] ParsingError),
#[error("peer storage not found")]
PeerStorageNotFound(#[from] PeerStorageNotFoundError),
}
#[derive(Error, Debug)]
pub enum PeerStorageNotFoundError {
#[error("peer info for {0} not found")]
PeerInfo(SocketAddr),
#[error("peer {0} not found")]
Peer(SocketAddr),
}