diff --git a/src/lib.rs b/src/lib.rs
index 5eeb130..f683f49 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,18 +1,30 @@
 mod bsp;
 
-pub fn read<R:std::io::Read>(mut input:R)->vbsp::BspResult<vbsp::Bsp>{
+pub struct Bsp(vbsp::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();
 
-	match input.read_to_end(&mut s){
-		Ok(_)=>(),
-		Err(e)=>println!("load_bsp::convert read_to_end failed: {:?}",e),
-	}
+	//TODO: mmap
+	input.read_to_end(&mut s).map_err(ReadError::Io)?;
 
-	vbsp::Bsp::read(s.as_slice())
+	vbsp::Bsp::read(s.as_slice()).map(Bsp).map_err(ReadError::Bsp)
 }
 
 pub fn convert<AcquireTextureId,AcquireMeshId>(
-	bsp:&vbsp::Bsp,
+	bsp:&Bsp,
 	acquire_texture_id:AcquireTextureId,
 	acquire_mesh_id:AcquireMeshId
 )->strafesnet_common::map::CompleteMap
@@ -20,5 +32,5 @@ where
 	AcquireTextureId:FnMut(&str)->strafesnet_common::model::TextureId,
 	AcquireMeshId:FnMut(&str)->strafesnet_common::model::MeshId,
 {
-	bsp::convert(bsp,acquire_texture_id,acquire_mesh_id)
+	bsp::convert(&bsp.0,acquire_texture_id,acquire_mesh_id)
 }
\ No newline at end of file