mod id;
mod info;
#[cfg(feature = "mods_db")] mod database;
#[cfg(test)] mod tests;
pub use self::id::{ModId, ModType};
pub use self::info::ModInfo;
use std::fmt;
use std::sync::Arc;
use smallvec::SmallVec;
#[derive(Clone)]
pub struct Mod {
type_: ModType,
text: String,
data: Option<(Arc<ModInfo>, ModValues)>,
}
impl Mod {
pub fn new<T: Into<String>>(type_: ModType, text: T) -> Self {
let text = text.into();
#[cfg(feature = "mods_db")]
let data = database::ITEM_MODS.resolve(type_, &text);
#[cfg(not(feature = "mods_db"))]
let data = None;
Mod{type_, text, data}
}
}
impl Mod {
#[inline]
pub fn mod_type(&self) -> ModType {
self.type_
}
#[inline]
#[cfg(feature = "mods_db")]
pub fn info(&self) -> Option<&ModInfo> {
self.data.as_ref().map(|&(ref mi, _)| &**mi)
}
#[inline]
#[cfg(feature = "mods_db")]
pub fn values(&self) -> Option<&ModValues> {
self.data.as_ref().map(|&(_, ref mv)| mv)
}
#[inline]
pub fn as_str(&self) -> &str {
self.text.as_str()
}
}
impl fmt::Debug for Mod {
fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result {
let mut ds = fmt.debug_struct("Mod");
ds.field("type", &self.type_);
match self.data {
Some((ref mi, ref vs)) => {
ds.field("text", &mi.text());
ds.field("values", vs);
}
None => { ds.field("text", &self.text); }
}
ds.finish()
}
}
pub type ModValue = f64;
pub type ModValues = SmallVec<[ModValue; 4]>;