diff --git a/src/core/region_processor.rs b/src/core/region_processor.rs index 0a8ad0e..04699d3 100644 --- a/src/core/region_processor.rs +++ b/src/core/region_processor.rs @@ -145,7 +145,7 @@ impl<'a> SingleRegionProcessor<'a> { return Ok(()); } - storage::write( + storage::write_file( &self.output_path, &self.processed_region, REGION_FILE_META_VERSION, diff --git a/src/core/tile_renderer.rs b/src/core/tile_renderer.rs index b341076..ce9fed3 100644 --- a/src/core/tile_renderer.rs +++ b/src/core/tile_renderer.rs @@ -105,7 +105,7 @@ impl<'a> TileRenderer<'a> { region_loader .get_or_try_init(|| async { - storage::read(&processed_path).context("Failed to load processed region data") + storage::read_file(&processed_path).context("Failed to load processed region data") }) .await .cloned() diff --git a/src/io/storage.rs b/src/io/storage.rs index 99a8d63..634f082 100644 --- a/src/io/storage.rs +++ b/src/io/storage.rs @@ -14,43 +14,50 @@ use serde::{de::DeserializeOwned, Serialize}; use super::fs; +/// Serializes data and writes it to a writer +pub fn write(writer: &mut W, value: &T) -> Result<()> { + let data = bincode::serialize(value)?; + let len = u32::try_from(data.len())?; + let compressed = zstd::bulk::compress(&data, 1)?; + drop(data); + + writer.write_all(&len.to_be_bytes())?; + writer.write_all(&compressed)?; + + Ok(()) +} + /// Serializes data and stores it in a file /// /// A timestamp is stored in an assiciated metadata file. -pub fn write( +pub fn write_file( path: &Path, value: &T, version: fs::FileMetaVersion, timestamp: SystemTime, ) -> Result<()> { - fs::create_with_timestamp(path, version, timestamp, |file| { - let data = bincode::serialize(value)?; - let len = u32::try_from(data.len())?; - let compressed = zstd::bulk::compress(&data, 1)?; - drop(data); + fs::create_with_timestamp(path, version, timestamp, |file| write(file, value)) +} - file.write_all(&len.to_be_bytes())?; - file.write_all(&compressed)?; +/// Reads data from a reader and deserializes it +pub fn read(reader: &mut R) -> Result { + let mut len_buf = [0u8; 4]; + reader.read_exact(&mut len_buf)?; + let len = usize::try_from(u32::from_be_bytes(len_buf))?; - Ok(()) - }) + let mut compressed = vec![]; + reader.read_to_end(&mut compressed)?; + let data = zstd::bulk::decompress(&compressed, len)?; + drop(compressed); + + Ok(bincode::deserialize(&data)?) } /// Reads data from a file and deserializes it -pub fn read(path: &Path) -> Result { +pub fn read_file(path: &Path) -> Result { (|| -> Result { let mut file = File::open(path)?; - - let mut len_buf = [0u8; 4]; - file.read_exact(&mut len_buf)?; - let len = usize::try_from(u32::from_be_bytes(len_buf))?; - - let mut compressed = vec![]; - file.read_to_end(&mut compressed)?; - let data = zstd::bulk::decompress(&compressed, len)?; - drop(compressed); - - Ok(bincode::deserialize(&data)?) + read(&mut file) })() .with_context(|| format!("Failed to read file {}", path.display())) }