use tari_features::resolver::Target;
use thiserror::Error;
use crate::{
configuration::Network,
exit_codes::{ExitCode, ExitError},
};
#[derive(Debug, Error)]
pub enum NetworkCheckError {
#[error("The network {0} is invalid for this binary built for MainNet")]
MainNetBinary(Network),
#[error("The network {0} is invalid for this binary built for NextNet")]
NextNetBinary(Network),
#[error("The network {0} is invalid for this binary built for TestNet")]
TestNetBinary(Network),
#[error("Could not set the network, tried to set to {attempted} but the current network is {current_network}")]
CouldNotSetNetwork {
attempted: Network,
current_network: Network,
},
}
impl From<NetworkCheckError> for ExitError {
fn from(err: NetworkCheckError) -> Self {
Self::new(ExitCode::NetworkError, err)
}
}
#[cfg(tari_target_network_mainnet)]
pub const TARGET_NETWORK: Target = Target::MainNet;
#[cfg(tari_target_network_nextnet)]
pub const TARGET_NETWORK: Target = Target::NextNet;
#[cfg(all(not(tari_target_network_mainnet), not(tari_target_network_nextnet)))]
pub const TARGET_NETWORK: Target = Target::TestNet;
pub fn is_network_choice_valid(network: Network) -> Result<Network, NetworkCheckError> {
match (TARGET_NETWORK, network) {
(Target::MainNet, n @ Network::MainNet | n @ Network::StageNet) => Ok(n),
(Target::MainNet, _) => Err(NetworkCheckError::MainNetBinary(network)),
(Target::NextNet, n @ Network::NextNet) => Ok(n),
(Target::NextNet, _) => Err(NetworkCheckError::NextNetBinary(network)),
(Target::TestNet, n @ Network::LocalNet | n @ Network::Igor | n @ Network::Esmeralda) => Ok(n),
(Target::TestNet, _) => Err(NetworkCheckError::TestNetBinary(network)),
}
}
pub fn set_network_if_choice_valid(network: Network) -> Result<(), NetworkCheckError> {
match is_network_choice_valid(network) {
Ok(network) => match Network::set_current(network) {
Ok(()) => Ok(()),
Err(instead_network) => {
if instead_network == network {
Ok(())
} else {
Err(NetworkCheckError::CouldNotSetNetwork {
attempted: network,
current_network: instead_network,
})
}
},
},
Err(e) => Err(e),
}
}