Source code

Revision control

Copy as Markdown

Other Tools

//! # `cobs`
//!
//! This is an implementation of the Consistent Overhead Byte Stuffing (COBS) algorithm in Rust.
//!
//! COBS is an algorithm for transforming a message into an encoding where a specific value (the
//! "sentinel" value) is not used. This value can then be used to mark frame boundaries in a serial
//! communication channel.
//!
//! See the [wikipedia article](https://www.wikipedia.org/wiki/Consistent_Overhead_Byte_Stuffing) for details.
//!
//! ## Features
//!
//! `cobs` supports various runtime environments and is also suitable for `no_std` environments.
//!
//! ### Default features
//!
//! - [`std`](https://doc.rust-lang.org/std/): Enables functionality relying on the standard library
//! and also activates the `alloc` feature. Currently only adds [std::error::Error] support for the
//! library error types.
//! - [`alloc`](https://doc.rust-lang.org/alloc/): Enables features which operate on containers
//! Enabled by the `std` feature.
//!
//! ### Optional features
//!
//! - [`defmt`](https://docs.rs/defmt/latest/defmt/): Adds `defmt::Format` derives on some data
//! structures and error types.
//! - [`serde`](https://serde.rs/): Adds `serde` derives on some data structures and error types.
#![no_std]
#![cfg_attr(docsrs, feature(doc_auto_cfg))]
#[cfg(feature = "alloc")]
extern crate alloc;
#[cfg(feature = "std")]
extern crate std;
// In the future, don't do this.
mod dec;
mod enc;
pub use crate::dec::*;
pub use crate::enc::*;
/// Calculates the maximum overhead when encoding a message with the given length.
/// The overhead is a maximum of [n/254] bytes (one in 254 bytes) rounded up.
#[inline]
pub const fn max_encoding_overhead(source_len: usize) -> usize {
source_len.div_ceil(254)
}
/// Calculates the maximum possible size of an encoded message given the length
/// of the source message. This may be useful for calculating how large the
/// `dest` buffer needs to be in the encoding functions.
#[inline]
pub const fn max_encoding_length(source_len: usize) -> usize {
source_len + max_encoding_overhead(source_len)
}
#[cfg(test)]
mod tests {
use super::*;
// Usable in const context
const ENCODED_BUF: [u8; max_encoding_length(5)] = [0; max_encoding_length(5)];
#[test]
fn test_buf_len() {
assert_eq!(ENCODED_BUF.len(), 6);
}
#[test]
fn test_overhead_empty() {
assert_eq!(max_encoding_overhead(0), 0);
}
#[test]
fn test_overhead_one() {
assert_eq!(max_encoding_overhead(1), 1);
}
#[test]
fn test_overhead_larger() {
assert_eq!(max_encoding_overhead(253), 1);
assert_eq!(max_encoding_overhead(254), 1);
}
#[test]
fn test_overhead_two() {
assert_eq!(max_encoding_overhead(255), 2);
}
}