#修改 #跟踪 #监控 #变更

track

跟踪结构数据修改

2 个不稳定版本

0.1.0 2020年2月21日
0.0.0 2020年2月14日

#1053 in 编码


用于 net-sync

MIT 许可证

24KB
288

Donate Latest Version docs Lines of Code MIT

跟踪数据修改

该库提供了一种无需样板代码的跟踪结构数据修改的方法。为了优化,仅跟踪调整过的字段。更改将被序列化并发送到通道。

功能

  • 监控数据中的修改
  • 基于 Serde(不包括字段,...)
  • 将修改应用于类型
  • 可定制的序列化

功能标志

功能 描述
bincode-serialization 使用 bincode 进行序列化(默认启用)。
rmp-serialization 使用 rmp-serde 进行序列化。

可选实现自己的序列化器元 SerializationStrategy](track/serialization/trait.SerializationStrategy.html)。

示例

首先,将 track 属性添加到您的结构中以标记它为可跟踪。

// imports all necessarily types for the `track` attribute.
use track::preclude::*;

#[track]
#[derive(Debug)]
pub struct Position {
    pub x: u32,
    pub y: u32,
}

您可以为 track 宏指定一个序列化方法。给出实现 SerializationStrategy 的类型的名称,并确保它对宏是可用的。例如

use track::serialization::bincode::Bincode;

#[track(serialization = "Bincode")]
struct Postition ...

现在让我们进行一些修改并将这些修改应用到其他实例上。

use track::{preclude::*, serialization::bincode::Bincode, Apply, ModificationChannel};

#[derive(Copy, Clone, Debug, PartialEq)]
pub struct Identity {
    pub value: u8,
}

impl Identifier for Identity {}

fn main() {
    let channel = ModificationChannel::<Identity>::new();

    let updated_storage = vec![
        (Identity { value: 1 }, Position { x: 0, y: 0 }),
        (Identity { value: 2 }, Position { x: 0, y: 0 }),
    ];
    let mut outdated_storage = updated_storage.clone();

    // == Make changes to storage ==
    make_changes(&channel, updated_storage);

    // == Apply changes to outdated storage ==
    apply_changes(&channel, &mut outdated_storage);
}

fn make_changes(channel: &ModificationChannel<Identity>, entities: Vec<(Identity, Position)>) {
    for (id, mut position) in entities {
        let mut position = position.track(channel.sender(), id); /* returns `Tracker` which tracks changes */

        // `Tracker` implements `DerefMut`
        position.x += 1;
        position.y += 1;
    } // <- on the `Drop` of `wrapper` changes are serialized and sent on the channel.
}

fn apply_changes(
    channel: &ModificationChannel<Identity>,
    entities: &mut Vec<(Identity, Position)>,
) {
    for event in channel.receiver().try_iter() {
        let entity = entities
            .iter_mut()
            .find(|e| e.0 == event.identifier)
            .unwrap();

        Apply::apply_to(&mut entity.1, &event.modified_fields, Bincode);

        println!("entity updated {:?}", entity);
    }
}

有关更深入的示例,请查看 github 上的 示例

依赖项

~2.5MB
~57K SLoC