use crate::VmfSerializable;
use super::vmf::entities::Entities;
use super::vmf::metadata::{VersionInfo, ViewSettings, VisGroups};
use super::vmf::regions::{Cameras, Cordons};
use super::vmf::world::World;
mod io;
mod merge;
mod visgroup_ops;
#[derive(Debug, Clone, PartialEq)]
#[cfg_attr(feature = "serialization", derive(Serialize, Deserialize))]
pub struct VmfFile {
#[cfg_attr(
feature = "serialization",
serde(default, skip_serializing_if = "Option::is_none")
)]
pub path: Option<String>,
pub versioninfo: VersionInfo,
pub visgroups: VisGroups,
pub viewsettings: ViewSettings,
pub world: World,
pub entities: Entities,
pub hiddens: Entities,
pub cameras: Cameras,
pub cordons: Cordons,
}
impl Default for VmfFile {
fn default() -> Self {
Self {
path: None,
versioninfo: Default::default(),
visgroups: Default::default(),
viewsettings: Default::default(),
world: Default::default(),
entities: Entities(Vec::with_capacity(128)),
hiddens: Entities(Vec::with_capacity(16)),
cameras: Default::default(),
cordons: Default::default(),
}
}
}
impl VmfFile {
pub fn to_vmf_string(&self) -> String {
let mut output = String::new();
output.push_str(&self.versioninfo.to_vmf_string(0));
output.push_str(&self.visgroups.to_vmf_string(0));
output.push_str(&self.viewsettings.to_vmf_string(0));
output.push_str(&self.world.to_vmf_string(0));
for entity in &*self.entities {
output.push_str(&entity.to_vmf_string(0));
}
for entity in &*self.hiddens {
output.push_str("hidden\n{\n");
output.push_str(&entity.to_vmf_string(1));
output.push_str("}\n");
}
output.push_str(&self.cameras.to_vmf_string(0));
output.push_str(&self.cordons.to_vmf_string(0));
output
}
}