#coap #transfer #constrained #logging #write #devices #buffer

no-std windowed-infinity

A data structure representing an infinite sequentially writable u8 vector of which a small view has writes to it preserved. This is primarily useful when implementing CoAP block-wise transfers, and also convenient for logging on constrained devices.

9 releases

new 0.1.8 Mar 5, 2025
0.1.7 Oct 30, 2024
0.1.5 Sep 10, 2024
0.1.4 Feb 1, 2023
0.1.0 Jan 22, 2019

#262 in No standard library

Download history 599/week @ 2024-11-16 750/week @ 2024-11-23 192/week @ 2024-11-30 597/week @ 2024-12-07 177/week @ 2024-12-14 13/week @ 2024-12-21 8/week @ 2024-12-28 409/week @ 2025-01-04 288/week @ 2025-01-11 564/week @ 2025-01-18 130/week @ 2025-01-25 758/week @ 2025-02-01 1254/week @ 2025-02-08 990/week @ 2025-02-15 566/week @ 2025-02-22 493/week @ 2025-03-01

3,332 downloads per month
Used in 5 crates (via coap-handler-implementati…)

MIT/Apache

34KB
470 lines

windowed-infinity License: MIT OR Apache-2.0 windowed-infinity on crates.io windowed-infinity on docs.rs Source Code Repository Rust Version: 1.75.0

This crate provides the WindowedInfinity struct and implementations of various traits to write to it.

Its primary purpose is to wrap a small buffer such that writes to it advance a cursor over a larger imaginary buffer, only persisting writes to the small buffer. After the buffer has been processed, a new WindowedInfinity can be set up and the writing process repeated. This is wasteful when the writes are computationally expensive, but convenient when operations only rarely exceed the buffer.

A typical practical example of a WindowedInfinity application is the implementation of CoAP block-wise transfer according to RFC7959; a simpler example is available in the demo.rs example.

Features

The set of traits implemented by WindowedInfinity depends on the configured cargo features:

  • With the std feature, it implements std::io::Write
  • With the with_serde_cbor feature, it uses serde_cbor’s trait unsealing feature to implement its Write trait.
  • Likewise, there are features for ciborium and minicbor. The minicbor version is a bit special in that there is both a with_minicbor / with_minicbor_0_19 feature.
  • Starting at with_minicbor_0_19, features carry a version. This allows users of different minicbor versions to coexist in the same crate, and moreover ensures that the dependencies expressed in the Cargo.toml files to describe the requirements precisely.
  • With the with_embedded_io_0_4, _0_6 and _async_0_6 features, the Write trait of embedded-io / -async is implemented.

Crate size

Compared to the original plan of “doing one thing, and doing that right”, this crate has grown a bit, in that it contains trait implementations for several serializers, and extra mechanism for combining the own writer with others (from cryptographic digests or CRCs). Both these are temporary – once there is a 1.0 version of embedded-io, the Tee will be split out into a dedicated crate (with only compatibility re-exports and constructors / destructors remaining), and once serializers start using the stable embedded-io, no more writer implementations will need to be added.

Dependencies

~0.6–1MB
~24K SLoC