use bitcoin::key::rand::distributions::Standard;
use bitcoin::key::rand::prelude::Distribution;
use bitcoin::key::rand::{thread_rng, Rng};
use bitcoin::p2p::address::AddrV2;
use bitcoin::p2p::ServiceFlags;
use crate::chain::IndexedHeader;
pub mod error;
#[cfg(feature = "rusqlite")]
pub mod sqlite;
pub mod traits;
#[derive(Debug, Clone, PartialEq)]
pub struct PersistedPeer {
pub addr: AddrV2,
pub port: u16,
pub services: ServiceFlags,
pub status: PeerStatus,
}
impl PersistedPeer {
pub fn new(addr: AddrV2, port: u16, services: ServiceFlags, status: PeerStatus) -> Self {
Self {
addr,
port,
services,
status,
}
}
pub(crate) fn gossiped(addr: AddrV2, port: u16, services: ServiceFlags) -> Self {
Self {
addr,
port,
services,
status: PeerStatus::Gossiped,
}
}
}
impl From<PersistedPeer> for (AddrV2, u16) {
fn from(value: PersistedPeer) -> Self {
(value.addr, value.port)
}
}
#[derive(Debug, Clone, PartialEq, PartialOrd)]
pub enum PeerStatus {
Gossiped,
Tried,
Ban,
}
impl Distribution<PeerStatus> for Standard {
fn sample<R: bitcoin::key::rand::Rng + ?Sized>(&self, rng: &mut R) -> PeerStatus {
match rng.gen_range(0..=1) {
0 => PeerStatus::Gossiped,
_ => PeerStatus::Tried,
}
}
}
impl PeerStatus {
pub(crate) fn random() -> PeerStatus {
let mut rng = thread_rng();
rng.gen()
}
}
#[derive(Debug, Clone)]
pub enum BlockHeaderChanges {
Connected(IndexedHeader),
Reorganized {
accepted: Vec<IndexedHeader>,
reorganized: Vec<IndexedHeader>,
},
}