Expand description
Create custom serializable changes to apply later
Deltastruct is an attribute macro that generates definitions for serializable changes (called deltas) over structs recursively.
For techinical reasons, the attribute macro must be applied to a mod
definition containing a struct
with the same name and an impl
for
it’s change definitions. Function names are converted to camel case to
appease the compiler.
The generated deltas are always the type name followed by Delta
. ie: Foo
-> FooDelta
, i32
-> i32Delta
.
#[deltastruct]
mod Vector3 {
#[derive(Clone, Copy)]
pub struct Vector3 {
pub x : f64,
pub y : f64,
pub z : f64,
}
impl Vector3 {
fn set(&mut self, other : Vector3) {
// Copy the given vec's components into our own.
self.x = other.x;
self.y = other.y;
self.z = other.z;
}
fn multiply_scalar(&mut self, n : f64) {
// Multiply each component by the given value
self.x *= n;
self.y *= n;
self.z *= n;
}
fn normalize(&mut self) {
// divide each component by the vector's magnitude
let magnitude = (
self.x.powf(2f64)
+ self.y.powf(2f64)
+ self.z.powf(2f64)
).sqrt();
self.x /= magnitude;
self.y /= magnitude;
self.z /= magnitude;
}
}
}
fn main() {
let mut v = Vector3 {
x: 3f64,
y: 6f64,
z: 6f64
};
let v_delta = Vector3Delta::MultiplyScalar(4f64);
v.apply(&v_delta);
v.apply(&v_delta);
assert_eq!(v.x, 48f64);
let v_delta = Vector3Delta::Normalize();
v.apply(&v_delta);
assert_eq!(v.z, 2f64/3f64);
let v_delta = Vector3Delta::X(f64Delta::Set(8f64));
v.apply(&v_delta);
assert_eq!(v.x, 8f64);
}
Enums§
- Hash
MapDelta - Hash
SetDelta - Option
Delta - String
Delta - VecDelta
- bool
Delta - char
Delta - f32Delta
- f64Delta
- i8Delta
- i16Delta
- i32Delta
- i64Delta
- isize
Delta - u8Delta
- u16Delta
- u32Delta
- u64Delta
- usize
Delta
Traits§
- Delta
Struct - A trait derived for each tagged struct where
T
is it’s generated delta.
Attribute Macros§
- deltastruct
- An attribute macro applied to
mod
s. Will generate a Delta and it’sDeltaStruct<_>
implementation.