extern crate message_to_parent;
use message_to_parent::MessageToParent;
struct Game {
network: Network,
database: Database,
}
impl Game {
pub fn new() -> Self {
Game {
network: Network::new(),
database: Database::new(),
}
}
pub fn main(&mut self) {
let mut network_message = self.network.receive();
network_message.run_side_effects(self);
println!("Game: Completed network side effects");
let mut database_message = self.database.some_random_thing();
database_message.run_side_effects(self);
println!("Game: Completed database side effects");
}
}
struct Network {}
impl Network {
pub fn new() -> Self {
Network {}
}
pub fn receive(&mut self) -> MessageToParent<Game, ()> {
let mut message = MessageToParent::<Game, ()>::new();
println!("Network: Received verification for player: [cool_guy]");
message.add_side_effect(|parent| {
parent.database.add_player("cool_guy".to_string());
});
message
}
pub fn send(&mut self, data: String) {
println!("Network: Sending data to some random endpoint: [{}]", data);
}
}
struct Database {
players: Vec<String>,
}
impl Database {
pub fn new() -> Self {
Database { players: vec![] }
}
pub fn add_player(&mut self, new_player: String) {
println!("Database: Adding player [{}]", &new_player);
self.players.push(new_player);
}
pub fn some_random_thing(&mut self) -> MessageToParent<Game, ()> {
let mut message = MessageToParent::<Game, ()>::new();
println!("Database: Sending some network data out for some reason!");
message.add_side_effect(|parent| {
parent.network.send("Hello from the database!".to_string());
});
message
}
}
fn main() {
Game::new().main();
}