Expand description
Runtime-agnostic buffer traits and configuration for async producer-consumer dispatch
This module defines the buffer abstraction without runtime-specific implementations. Actual buffer implementations are provided by adapter crates:
aimdb-tokio-adapter- Tokio-based buffers (std environments)aimdb-embassy-adapter- Embassy-based buffers (embedded no_std)
§Buffer Types
Three buffering strategies are supported:
- SPMC Ring: Bounded backlog with per-consumer lag tolerance
- SingleLatest: Only newest value kept (no backlog)
- Mailbox: Single-slot with overwrite semantics
§Design Philosophy
Each record type can choose the appropriate buffer based on its data flow:
- High-frequency telemetry → SPMC ring
- Configuration state → SingleLatest
- Commands/triggers → Mailbox
§Architecture
┌─────────────────────────────────────────────────┐
│ aimdb-core (trait layer) │
│ BufferBackend<T> + BufferReader<T> + BufferCfg │
└────────────────┬────────────────────────────────┘
│
┌───────────┴───────────┐
│ │
▼ ▼
┌─────────────┐ ┌──────────────────┐
│ tokio impl │ │ embassy impl │
│ (std) │ │ (no_std) │
└─────────────┘ └──────────────────┘§Example
ⓘ
use aimdb_core::buffer::BufferCfg;
// High-frequency sensor data
reg.buffer(BufferCfg::SpmcRing { capacity: 2048 })
.source(|em, data| async { ... })
.tap(|em, data| async { ... });
// Configuration updates
reg.buffer(BufferCfg::SingleLatest)
.source(|em, cfg| async { ... })
.tap(|em, cfg| async { ... });Re-exports§
pub use crate::DbError as BufferError;
Enums§
- Buffer
Cfg - Buffer configuration for a record type
Traits§
- Buffer
- Static buffer trait for concrete implementations
- Buffer
Reader - Reader trait for consuming values from a buffer
- DynBuffer
- Dynamic buffer trait for trait objects (object-safe)
- Json
Buffer Reader - Reader trait for consuming JSON-serialized values from a buffer (std only)
Type Aliases§
- Buffer
Result - Result type for buffer operations