//! q IPC protocol and value semantics for qroissant.
//!
//! This crate provides the core building blocks for encoding, decoding, and
//! representing q/kdb+ IPC messages:
//!
//! - **`protocol`** — type codes, primitives, shapes, and attributes that
//!   define the q wire format.
//! - **`value`** — the `Value` enum and its variants (`Atom`, `Vector`,
//!   `List`, `Dictionary`, `Table`) that model q data in Rust.
//! - **`frame`** — message framing, header parsing, compression, and the
//!   `StreamingDecompressor` for incremental LZW decompression.
//! - **`decode`** — synchronous message and value decoding with optional
//!   parallel column decode via rayon.
//! - **`encode`** — serialisation of `Value` trees into q IPC byte frames.
//! - **`pipelined`** — asynchronous (`tokio::io::AsyncRead`) value decoder
//!   for streaming use cases.
//! - **`extent`** — zero-allocation byte extent scanning used to locate
//!   column boundaries for parallel decode.

pub mod decode;
pub mod encode;
pub mod error;
pub mod extent;
pub mod frame;
pub mod pipelined;
pub mod protocol;
pub mod value;

pub use decode::DecodeOptions;
pub use decode::DecodedMessage;
pub use decode::decode_message;
pub use decode::decode_message_with_options;
pub use decode::decode_value;
pub use decode::decode_value_with_options;
pub use encode::encode_message;
pub use encode::encode_value;
pub use error::CoreError;
pub use error::CoreResult;
pub use extent::value_byte_extent;
pub use frame::Compression;
pub use frame::Encoding;
pub use frame::Frame;
pub use frame::HEADER_LEN;
pub use frame::MessageHeader;
pub use frame::MessageType;
pub use frame::StreamingDecompressor;
pub use frame::read_frame;
pub use frame::read_message_length;
pub use frame::serialize_body_as_message;
pub use protocol::Attribute;
pub use protocol::Primitive;
pub use protocol::Shape;
pub use protocol::TypeCode;
pub use protocol::ValueType;
pub use value::Atom;
pub use value::Dictionary;
pub use value::List;
pub use value::Table;
pub use value::Value;
pub use value::Vector;
pub use value::VectorData;
