use ic_wire::Limits;
use serde::{Serialize, de::DeserializeOwned};
pub use ic_wire::Error;
pub const MAX_NODES: usize = 1_048_576;
pub const MAX_DEPTH: usize = 256;
pub const MAX_HEAP_BYTES: usize = 256 * 1024 * 1024;
pub const MAX_REPLY_BYTES: usize = 3 * 1024 * 1024;
pub const MAX_REQUEST_BYTES: usize = 2 * 1024 * 1024;
#[must_use]
pub const fn limits(bytes: usize) -> Limits {
Limits {
bytes,
allocation: MAX_HEAP_BYTES.saturating_add(bytes),
nodes: MAX_NODES,
depth: MAX_DEPTH,
}
}
#[must_use]
pub const fn sizing_limits() -> Limits {
limits(usize::MAX - MAX_HEAP_BYTES)
}
pub fn encode_one<T: Serialize>(value: T) -> Result<Vec<u8>, Error> {
ic_wire::native::encode(&value, limits(MAX_REPLY_BYTES))
}
pub fn decode_one<T: Serialize + DeserializeOwned>(bytes: &[u8]) -> Result<T, Error> {
ic_wire::native::decode(bytes, limits(MAX_REPLY_BYTES))
}
pub fn encoded_len<T: Serialize + ?Sized>(value: &T) -> Result<usize, Error> {
ic_wire::native::encoded_len(value, sizing_limits())
}
#[cfg(test)]
mod tests;