diff --git a/Cargo.lock b/Cargo.lock index b988226..1edd0b9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -67,12 +67,33 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "86fdf8605db99b54d3cd748a44c6d04df638eb5dafb219b135d0149bd0db01f6" [[package]] -name = "bincode" -version = "1.3.3" +name = "array-init" +version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" +checksum = "3d62b7694a562cdf5a74227903507c56ab2cc8bdd1f781ed5cb4cf9c9f810bfc" + +[[package]] +name = "binrw" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d4bca59c20d6f40c2cc0802afbe1e788b89096f61bdf7aeea6bf00f10c2909b" dependencies = [ - "serde", + "array-init", + "binrw_derive", + "bytemuck", +] + +[[package]] +name = "binrw_derive" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8ba42866ce5bced2645bfa15e97eef2c62d2bdb530510538de8dd3d04efff3c" +dependencies = [ + "either", + "owo-colors", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] @@ -81,6 +102,12 @@ version = "3.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" +[[package]] +name = "bytemuck" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d" + [[package]] name = "cc" version = "1.1.30" @@ -127,7 +154,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn", + "syn 2.0.79", ] [[package]] @@ -142,6 +169,12 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3fd119d74b830634cea2a0f58bbd0d54540518a14397557951e79340abc28c0" +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + [[package]] name = "fixx" version = "0.0.0-git" @@ -212,7 +245,7 @@ checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" name = "libixx" version = "0.0.0-git" dependencies = [ - "bincode", + "binrw", "serde", "serde_json", "thiserror", @@ -245,6 +278,12 @@ version = "1.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" +[[package]] +name = "owo-colors" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1b04fb49957986fdce4d6ee7a65027d55d4b6d2265e5848bbb507b58ccfdb6f" + [[package]] name = "percent-encoding" version = "2.3.1" @@ -321,7 +360,7 @@ checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.79", ] [[package]] @@ -354,6 +393,17 @@ version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "syn" version = "2.0.79" @@ -382,7 +432,7 @@ checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.79", ] [[package]] @@ -508,7 +558,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn", + "syn 2.0.79", "wasm-bindgen-shared", ] @@ -530,7 +580,7 @@ checksum = "26c6ab57572f7a24a4985830b120de1594465e5d500f24afe89e16b4e833ef68" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.79", "wasm-bindgen-backend", "wasm-bindgen-shared", ] diff --git a/libixx/Cargo.toml b/libixx/Cargo.toml index 45d4ec0..4ca5bbe 100644 --- a/libixx/Cargo.toml +++ b/libixx/Cargo.toml @@ -8,7 +8,7 @@ license = "MIT OR Apache-2.0" [dependencies] serde = { version = "1.0", features = ["derive"] } thiserror = "1.0" -bincode = "1.3" +binrw = "0.14" [dev-dependencies] serde_json = "1.0" diff --git a/libixx/src/error.rs b/libixx/src/error.rs index 09374e7..b8e85a1 100644 --- a/libixx/src/error.rs +++ b/libixx/src/error.rs @@ -1,3 +1,5 @@ +use std::string::FromUtf8Error; + use thiserror::Error; #[derive(Error, Debug)] @@ -8,5 +10,7 @@ pub enum IxxError { RecursiveReference, #[error("(de)serialization failed")] - Bincode(#[from] bincode::Error), + Binrw(#[from] binrw::Error), + #[error("invalid utf8")] + FromUtf8Error(#[from] FromUtf8Error), } diff --git a/libixx/src/index.rs b/libixx/src/index.rs index 723686a..f30c1f1 100644 --- a/libixx/src/index.rs +++ b/libixx/src/index.rs @@ -1,49 +1,64 @@ -use std::io::{Read, Write}; +use std::io::{Cursor, Read, Seek, Write}; -use serde::{Deserialize, Serialize}; +use binrw::{binrw, BinRead, BinWrite, Endian, NullString}; use crate::IxxError; -#[derive(Default, Debug, Clone, PartialEq, Serialize, Deserialize)] -pub struct Index(Vec>); +#[binrw(magic = b"ixx01", little)] +#[derive(Default, Debug, Clone, PartialEq)] +pub struct Index { + #[bw(calc = entries.len() as u32)] + count: u32, + #[br(count = count)] + entries: Vec, +} + +#[binrw] +#[derive(Default, Debug, Clone, PartialEq)] +pub struct Entry { + #[bw(calc = labels.len() as u16)] + count: u16, + #[br(count = count)] + labels: Vec