Crate rundo [] [src]

Rundo is a redo / undo library for rust which can auto generate actions.

Thanks for rust Procedural Macros, Rundo will be disign and implementation to zero-cost support undo-redo in Rust. Rundo dedicated to support undo/redo transparent for user code, it's should be used painless. In most case, just use rundo attrs #[rundo] for your data struct, that all.

Installation

Add this to your Cargo.toml:

[dependencies]
rundo = "0.1"

Examples

below code will show how can Rundo maight be used.

#![feature(proc_macro)]
#![feature(decl_macro)]

extern crate rundo;
use rundo::prelude::*;

#[rundo]
struct Point {
    x: f32,
    y: f32,
}

// Note here the macro `Point`, Rundo redefine your origin Point type
// with the same shape, but support undo redo.
// You can use it as same as before, but to literal construct
// must use a same name macro replace.

fn main(){
  let mut space = Workspace::new(Point! {x: 2.0, y: 2.0,});
  {
    // access data across get_mut will auto collect change action during its life time.
    *space.get_mut().x = 3.0;
  }

 // x was changed to 3.0
 assert_eq!(*space.data.x, 3.0);

 // x will undo to 2.0
 space.undo();
 assert_eq!(*space.data.x, 2.0);

 // x will redo to 3.0
 space.redo();
 assert_eq!(*space.data.x, 3.0);
}

You can also manual control change action generate;

let mut space = Workspace::new(Point! {x: 2.0, y: 2.0,});
space.begin_op();       // form here all chage will be
                          // merge to one op until `end_op` called

*space.get_mut().x = 5.0;
*space.get_mut().y = 6.0;
*space.get_mut().x = 3.0;

space.end_op();        // generate op

// only a user op will be generate
space.undo();

assert_eq!(*space.data.x, 2.0);
assert_eq!(*space.data.y, 2.0);

#[rundo(skip)] skip this field

if some field in your struct you don't want to undo/redo it, add #[rundo(skip)] before it.

let mut space = Workspace::new(Point! {x: 2.0, y: 2.0,});

space.get_mut().x = 5.0;
*space.get_mut().y = 6.0;

space.undo();

// x change will be not capture, undo will not occur on it.
assert_eq!(space.data.x, 5.0);
// but y is undo to 2.0
assert_eq!(*space.data.y, 2.0);

You can use [README]: https://github.com/M-Adoo/rundo#rundo

Modules

prelude
workspace