#delta #structs #calculate #macro #define #generate #deltoid

macro deltoid-derive

Derive macro that generates code to calculate and apply deltas to structs and enums

24 releases

0.12.0 Jul 2, 2023
0.11.1 May 6, 2021
0.11.0 Apr 29, 2021
0.10.0 Mar 27, 2021
0.3.0 Mar 12, 2020

#27 in #generates

Download history 71/week @ 2024-09-21 12/week @ 2024-09-28 9/week @ 2024-10-05 50/week @ 2024-10-12 10/week @ 2024-10-19 1/week @ 2024-10-26 18/week @ 2024-11-02 2/week @ 2024-11-16 7/week @ 2024-11-23 2/week @ 2024-11-30 27/week @ 2024-12-07 16/week @ 2024-12-14

52 downloads per month

MIT/Apache

285KB
7.5K SLoC

Deltoid

Rust

Synopsis

Deltoid is a type-driven rust library that can be used to calculate deltas. A delta Δ can be calculated between 2 values a and b of the same type. Once calculated, Δ can then be applied to the first value a to obtain a new value c that is equivalent to the second value b.

A primary use case for calculating delta's is to keep track of a sequence of related and potentially deeply-nested data trees while making sure to keep resource consumption (e.g. RAM, network bandwidth) reasonable. Since such a sequence may be exported for further processing, delta's are by definition de/serializable. This allows you to collect the data in once place as a sequence of delta's, export it (perhaps over a network connection), and then reconstruct the original sequence on the receiving side by successively applying the delta's in the sequence.

Usage

Add this to your Cargo.toml:

[dependencies]
deltoid = "0.11.1"
deltoid-derive = "0.11.1"

Computing a delta, then applying it:

use deltoid::Deltoid;
use serde_derive::{Deserialize, Serialize};

#[derive(Deserialize, Serialize, Deltoid)]
struct Point {
    x: usize,
    y: usize,
}

fn main() {
    // Define 2 instances of the same type
    let point0 = Point { x:  0, y: 0 };
    let point1 = Point { x: 42, y: 8 };

    // Calculate the delta between them
    let delta = point0.delta(&point1).unwrap();

    // Apply  the delta to `point0`
    let point2 = point0.apply(delta).unwrap();
    assert_eq!(point1, point2);
}

Limitations

There are some limitations to this library:

  1. Unions are not supported. Only structs and enums are currently supported.

  2. The derive macro tries to accommodate generic types, but for types making use of advanced generics a manual implementation is generally recommended over using deltoid-derive because it allows for finer control.

  3. Types that have fields that have a borrow type (i.e. &T and &mut T for some type T) are not currently supported. This limitation may be lifted in the future for mutable borrows, but is pretty fundamental for immutable borrows.

  4. It's possible that while developing you notice that a set of impls is missing for a type in Rust's stdlib. If so, this is because support for types that are a part of stdlib must be added manually and simply hasn't been done yet. You can file an issue for that, or even better, send a PR :)

Special Thanks

A special thanks to Accept B.V. for sponsoring this project.

Dependencies

~0.3–2.4MB
~49K SLoC