51 lines
1.8 KiB
Rust
51 lines
1.8 KiB
Rust
use crate::database::Database;
|
|
use crate::error::Result;
|
|
use geoffrey_models::models::locations::market::Market;
|
|
use geoffrey_models::models::locations::town::Town;
|
|
use geoffrey_models::models::locations::{Location, LocationData, LocationDataDb, LocationDb};
|
|
use geoffrey_models::models::player::Player;
|
|
|
|
pub fn load_location_data(db: &Database, data: &LocationDataDb) -> Result<LocationData> {
|
|
Ok(match data {
|
|
LocationDataDb::Base => LocationData::Base,
|
|
LocationDataDb::Shop(shop_data) => LocationData::Shop(shop_data.clone()),
|
|
LocationDataDb::Attraction => LocationData::Attraction,
|
|
LocationDataDb::Town(town_data) => {
|
|
let town_data = Town {
|
|
residents: db
|
|
.filter(|id, _: &Player| town_data.residents.contains(&id))?
|
|
.collect(),
|
|
};
|
|
|
|
LocationData::Town(town_data)
|
|
}
|
|
LocationDataDb::Farm(farm_data) => LocationData::Farm(farm_data.clone()),
|
|
LocationDataDb::Market(market_data) => {
|
|
let shops: Result<Vec<Location>> = db
|
|
.filter(|id, _: &LocationDb| market_data.shops.contains(&id))?
|
|
.map(|loc| load_location(db, &loc))
|
|
.collect();
|
|
|
|
let market_data = Market {
|
|
is_public: market_data.is_public,
|
|
shops: shops?,
|
|
};
|
|
|
|
LocationData::Market(market_data)
|
|
}
|
|
})
|
|
}
|
|
|
|
pub fn load_location(db: &Database, location: &LocationDb) -> Result<Location> {
|
|
let owners: Vec<Player> = db
|
|
.filter(|id, _: &Player| location.owners().contains(&id))?
|
|
.collect();
|
|
let loc_data = load_location_data(db, &location.loc_data)?;
|
|
|
|
Ok(Location::from_db_location(
|
|
location.clone(),
|
|
owners,
|
|
loc_data,
|
|
))
|
|
}
|