use std::io::Read;

mod rbx;
mod primitives;

#[derive(Debug)]
pub enum Error{
	RbxBinary(rbx_binary::DecodeError),
	RbxXml(rbx_xml::DecodeError),
	Io(std::io::Error),
	UnknownFileFormat,
}

fn load_dom<R:Read>(input:R)->Result<rbx_dom_weak::WeakDom,Error>{
	let mut buf=std::io::BufReader::new(input);
	let peek=std::io::BufRead::fill_buf(&mut buf).map_err(Error::Io)?;
	match &peek[0..8]{
		b"<roblox!"=>return rbx_binary::from_reader(buf).map_err(Error::RbxBinary),
		b"<roblox "=>return rbx_xml::from_reader_default(buf).map_err(Error::RbxXml),
		_=>Err(Error::UnknownFileFormat),
	}
}

pub fn read<R:Read,F:FnMut(&str)->Option<strafesnet_common::model::TextureId>>(input:R,acquire_id:F)->Result<strafesnet_common::map::CompleteMap,Error>{
	Ok(rbx::convert(load_dom(input)?,acquire_id))
}