# Loam This is a Rust library for storing and querying tree-like data structures in files. The motivating project is [rosewood], which stores geospatial data in an [R-Tree]. __Loam__ allows you to store anything which implements `Serialize`. Data is appended to the end of the file and never modified once written. This enables the use of `mmap` to read files without the risk of undefined behavior. ## Write Example ```rust fn main() -> Result<(), Box> { let mut writer = loam::Writer::new("../target/test.loam")?; let id = writer.push(&"Don't forget me!")?; writer.checkpoint(id)?; Ok(()) } ``` ## Read Example ```rust fn main() -> Result<(), Box> { let reader = loam::Reader::new("../target/test.loam")?; let id = reader.root()?; let msg: String = reader.lookup(id)?; dbg!(msg); Ok(()) } ``` ## File Format A __loam__ file starts with a __Header__, followed by a series of __Chunks__. ### Header The header is fixed-length ASCII text (8 bytes). Field | Value | Bytes --------------|--------------|------ Magic | `loam` | 4 Major Version | digits: `00` | 2 Minor Version | digits: `00` | 2 ### Chunks A chunk consists of these fields, serialized using [bincode]: Field | Description -----------|-------------------------------------------------- Length | Number of bytes in *Data* (variable-size integer) Data | Serialized chunk data Checksum † | CRC-32 of *Length* + *Data* (fixed-size integer) An __Id__ is the file offset of a chunk. It can be used to `Deserialize` the Data field. † Checksums are only included if the `crc` feature is enabled. ### Checkpoint A checkpoint is a special chunk containing a fixed-size `u64` of the root __Id__. A file must always end with a checkpoint, to allow readers to lookup the root without needing to scan the entire file. [bincode]: https://github.com/bincode-org/bincode [rosewood]: ../rosewood/index.html [r-tree]: https://en.wikipedia.org/wiki/R-tree