use crate::{
dev_utils::{
network::{ConsensusError, Network},
new_common_rng, new_rng, RngChoice, Schedule,
},
observation::ConsensusMode,
};
use rand_xorshift::XorShiftRng;
use std::fmt;
pub struct Environment {
pub network: Network,
pub rng: XorShiftRng,
pub rng2: XorShiftRng,
}
impl Environment {
pub fn with_consensus_mode(seed: RngChoice, consensus_mode: ConsensusMode) -> Self {
let mut rng = new_common_rng(seed);
let rng2 = new_rng(&mut rng);
let network = Network::new(consensus_mode);
Self { network, rng, rng2 }
}
pub fn new(seed: RngChoice) -> Self {
Self::with_consensus_mode(seed, ConsensusMode::Supermajority)
}
pub fn execute_schedule(&mut self, schedule: Schedule) -> Result<(), ConsensusError> {
self.network
.execute_schedule(&mut self.rng, &mut self.rng2, schedule)
}
}
impl fmt::Debug for Environment {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(
f,
"Environment({} peers, {:?})",
self.network.peers.len(),
self.rng
)
}
}