use crate::chain::{Chain, SyncState};
use crate::core::core::hash::Hash;
use crate::handlers::chain_api::{ChainCompactHandler, ChainResetHandler, ChainValidationHandler};
use crate::handlers::peers_api::{PeerHandler, PeersConnectedHandler};
use crate::handlers::server_api::StatusHandler;
use crate::p2p::types::PeerInfoDisplay;
use crate::p2p::{self, PeerData};
use crate::rest::*;
use crate::types::Status;
use std::net::SocketAddr;
use std::sync::Weak;
pub struct Owner {
pub chain: Weak<Chain>,
pub peers: Weak<p2p::Peers>,
pub sync_state: Weak<SyncState>,
}
impl Owner {
pub fn new(chain: Weak<Chain>, peers: Weak<p2p::Peers>, sync_state: Weak<SyncState>) -> Self {
Owner {
chain,
peers,
sync_state,
}
}
pub fn get_status(&self) -> Result<Status, Error> {
let status_handler = StatusHandler {
chain: self.chain.clone(),
peers: self.peers.clone(),
sync_state: self.sync_state.clone(),
};
status_handler.get_status()
}
pub fn validate_chain(&self, assume_valid_rangeproofs_kernels: bool) -> Result<(), Error> {
let chain_validation_handler = ChainValidationHandler {
chain: self.chain.clone(),
};
chain_validation_handler.validate_chain(assume_valid_rangeproofs_kernels)
}
pub fn compact_chain(&self) -> Result<(), Error> {
let chain_compact_handler = ChainCompactHandler {
chain: self.chain.clone(),
};
chain_compact_handler.compact_chain()
}
pub fn reset_chain_head(&self, hash: String) -> Result<(), Error> {
let hash = Hash::from_hex(&hash)
.map_err(|_| ErrorKind::RequestError("invalid header hash".into()))?;
let handler = ChainResetHandler {
chain: self.chain.clone(),
sync_state: self.sync_state.clone(),
};
handler.reset_chain_head(hash)
}
pub fn invalidate_header(&self, hash: String) -> Result<(), Error> {
let hash = Hash::from_hex(&hash)
.map_err(|_| ErrorKind::RequestError("invalid header hash".into()))?;
let handler = ChainResetHandler {
chain: self.chain.clone(),
sync_state: self.sync_state.clone(),
};
handler.invalidate_header(hash)
}
pub fn get_peers(&self, addr: Option<SocketAddr>) -> Result<Vec<PeerData>, Error> {
let peer_handler = PeerHandler {
peers: self.peers.clone(),
};
peer_handler.get_peers(addr)
}
pub fn get_connected_peers(&self) -> Result<Vec<PeerInfoDisplay>, Error> {
let peers_connected_handler = PeersConnectedHandler {
peers: self.peers.clone(),
};
peers_connected_handler.get_connected_peers()
}
pub fn ban_peer(&self, addr: SocketAddr) -> Result<(), Error> {
let peer_handler = PeerHandler {
peers: self.peers.clone(),
};
peer_handler.ban_peer(addr)
}
pub fn unban_peer(&self, addr: SocketAddr) -> Result<(), Error> {
let peer_handler = PeerHandler {
peers: self.peers.clone(),
};
peer_handler.unban_peer(addr)
}
}