1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
pub mod internal; pub mod prelude { // Likely the minimum API that should go here. It's easier to add later than to remove. pub use { crate:: { read, write }, tree_buf_macros:: { Read, Write } }; // This section makes everything interesting available to the rest of the crate // without bothering to manage imports. pub(crate) use crate::{internal::*, error::*, primitive::{Primitive, PrimitiveId} }; } pub use prelude::*; pub use internal::error::Error; // TODO: Create another Readable/Writable trait that would be public, without the associated type. Then impl Readable for the internal type. // That would turn Readable into a tag that one could use as a constraint, without exposing any internal details pub use internal::{Readable, Writable, NonArrayBranch}; use internal::encodings::varint::{encode_suffix_varint}; pub fn write<T: Writable>(value: &T) -> Vec<u8> { let mut writer = T::Writer::new(); writer.write(value); let mut lens = Vec::new(); let mut bytes = Vec::new(); // TODO: The pre-amble could come back as optional, as long as it has it's own PrimitiveId writer.flush(NonArrayBranch, &mut bytes, &mut lens); for len in lens.iter().rev() { encode_suffix_varint(*len as u64, &mut bytes); } bytes } pub fn read<T: Readable>(bytes: &[u8]) -> Result<T, Error> { if bytes.len() == 0 { return Err(Error::InvalidFile); } let sticks = read_root(bytes); let mut reader = T::Reader::new(sticks, NonArrayBranch); Ok(reader.read()) } // TODO: Figure out recursion, at least enough to handle this: https://docs.rs/serde_json/1.0.44/serde_json/value/enum.Value.html // TODO: Nullable should be able to handle recursion as well, even if Option doesn't. (Option<Box<T>> could though) // TODO: When deriving, use the assert implements check that eg: Clone does, to give good compiler errors // If this is not possible because it's an internal API, use static_assert // TODO: Evaluate TurboPFor https://github.com/powturbo/TurboPFor // or consider the best parts of it. The core differentiator here // is the ability to use this.