#[cfg(test)]
mod tests;
use crate::error::{Error, Result};
use crate::market::Market;
use crate::resources::Resources;
use crate::resources::gold::Gold;
use crate::ruler::Ruler;
use crate::world::World;
use std::ops::AddAssign;
impl World {
pub fn market(&self) -> &Market {
&self.market
}
pub(crate) fn market_mut(&mut self) -> &mut Market {
&mut self.market
}
pub fn buy_resources(&mut self, ruler: &Ruler, resources: Resources) -> Result<()> {
let fee = resources * self.market().fee();
let gold = Gold::from(resources + fee);
self.ruler_mut(ruler)?.withdraw_gold(gold)?;
self.market.vault_mut().withdraw(resources)?;
self.add_resources_within_capacity(ruler.clone(), resources)?;
self.emit_ruler(ruler)?;
self.emit_market()?;
Ok(())
}
pub fn sell_resources(&mut self, ruler: &Ruler, resources: Resources) -> Result<()> {
self
.ruler_mut(ruler)?
.withdraw_resources(resources)?;
self
.market_mut()
.vault_mut()
.store(resources);
self
.ruler_mut(ruler)?
.gold_mut()
.add_assign(resources);
self.emit_ruler(ruler)?;
self.emit_market()?;
Ok(())
}
pub fn send_resources(&mut self, from: &Ruler, to: &Ruler, resources: Resources) -> Result<()> {
if from == to {
return Err(Error::ResourceReceiverIsSender(from.clone()));
}
let fee = resources * self.market().fee();
let total = resources + fee;
self
.ruler_mut(from)?
.withdraw_resources(total)?;
self.add_resources_within_capacity(to.clone(), resources)?;
self.emit_ruler(from)?;
self.emit_ruler(to)?;
self.market_mut().vault_mut().store(fee);
self.emit_market()?;
Ok(())
}
}