peat-lite 0.2.5

Lightweight CRDT primitives for resource-constrained Peat nodes
Documentation
// Copyright (c) 2025-2026 Defense Unicorns, Inc.
// SPDX-License-Identifier: Apache-2.0
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

//! # peat-lite
//!
//! Lightweight CRDT primitives for resource-constrained Peat nodes.
//!
//! This crate provides bounded, `no_std`-compatible data structures suitable
//! for devices with limited memory (256KB RAM budget), such as:
//!
//! - WearTAK on Samsung watches
//! - ESP32 sensor nodes
//! - LoRa mesh devices
//!
//! ## Features
//!
//! - **`std`** (default): Enables standard library support
//! - **`android`**: Enables UniFFI bindings for Android/Kotlin
//! - Disable default features for `no_std`: `--no-default-features`
//!
//! ## Primitives
//!
//! | Type | Purpose | Memory |
//! |------|---------|--------|
//! | [`NodeId`] | 32-bit node identifier | 4 bytes |
//! | [`CannedMessage`] | Predefined message codes | 1 byte |
//! | [`CannedMessageEvent`] | Message with metadata | ~24 bytes |
//! | [`LwwRegister`] | Last-writer-wins register | sizeof(T) + 12 bytes |
//! | [`GCounter`] | Grow-only distributed counter | 4 bytes per node |
//!
//! ## Example
//!
//! ```rust
//! use peat_lite::{NodeId, CannedMessage, CannedMessageEvent};
//!
//! let my_node = NodeId::new(0x12345678);
//! let event = CannedMessageEvent::new(
//!     CannedMessage::Ack,
//!     my_node,
//!     Some(NodeId::new(0xDEADBEEF)),  // target
//!     1706234567000,  // timestamp ms
//! );
//!
//! // Encode for transmission
//! let bytes = event.encode();
//! assert_eq!(bytes[0], 0xAF);  // CannedMessage marker
//! ```

#![cfg_attr(not(feature = "std"), no_std)]

pub mod canned;
pub mod counter;
pub mod lww;
pub mod node_id;
pub mod protocol;
pub mod wire;

// Re-export main types at crate root
pub use canned::{
    CannedMessage, CannedMessageAckEvent, CannedMessageEvent, CannedMessageStore, MAX_CANNED_ACKS,
};
pub use counter::GCounter;
pub use lww::LwwRegister;
pub use node_id::NodeId;
pub use wire::{
    WireError, CANNED_ACK_EVENT_MAX_SIZE, CANNED_MESSAGE_MARKER, CANNED_MESSAGE_SIGNED_SIZE,
    CANNED_MESSAGE_UNSIGNED_SIZE, SIGNATURE_SIZE,
};

// Re-export protocol types at crate root for ergonomic access
pub use protocol::constants::*;
pub use protocol::ota;
pub use protocol::{
    append_ttl, decode_header, default_ttl_for_crdt, encode_header, strip_ttl, CrdtType, Header,
    MessageError, MessageType, NodeCapabilities,
};