mod bsp;
pub mod data;

pub use data::Bsp;

#[derive(Debug)]
pub enum ReadError{
	Bsp(vbsp::BspError),
	Io(std::io::Error),
}
impl std::fmt::Display for ReadError{
	fn fmt(&self,f:&mut std::fmt::Formatter<'_>)->std::fmt::Result{
		write!(f,"{self:?}")
	}
}
impl std::error::Error for ReadError{}

pub fn read<R:std::io::Read>(mut input:R)->Result<Bsp,ReadError>{
	let mut s=Vec::new();

	//TODO: mmap
	input.read_to_end(&mut s).map_err(ReadError::Io)?;

	vbsp::Bsp::read(s.as_slice()).map(Bsp::new).map_err(ReadError::Bsp)
}

pub fn convert<AcquireRenderConfigId,AcquireMeshId>(
	bsp:&Bsp,
	acquire_render_config_id:AcquireRenderConfigId,
	acquire_mesh_id:AcquireMeshId
)->bsp::PartialMap1
where
	AcquireRenderConfigId:FnMut(Option<&str>)->strafesnet_common::model::RenderConfigId,
	AcquireMeshId:FnMut(&str)->strafesnet_common::model::MeshId,
{
	bsp::convert_bsp(bsp.as_ref(),acquire_render_config_id,acquire_mesh_id)
}