#derive #fields #field

macro fields-converter-derive

Fields-wise type conversions derive macros

4 releases

Uses old Rust 2015

0.1.4 Nov 19, 2018
0.1.3 Nov 19, 2018
0.1.2 Nov 19, 2018
0.1.1 Nov 17, 2018
0.1.0 Nov 17, 2018

#101 in #fields

27 downloads per month
Used in 2 crates (via clone-fields)

MIT/Apache

26KB
351 lines

fields-converter-derive

pipeline status crates.io docs.rs

Collection of procedural macros to allow you "copy", "move" and "duplicate" your structs fields-wise.

Here's an ultimate example to give you a feel for what you can do with this crate:

#[macro_use(Duplicate, MoveFields, CloneFields, EqFields, OrdFields)]
extern crate fields_converter_derive;
extern crate clone_fields;
use clone_fields::{CloneInto, CloneFrom};

#[derive(Duplicate, MoveFields, CloneFields, EqFields, OrdFields, Debug)]
#[destinations("Copied")]
#[add_derives(Clone, Debug, PartialEq)]
struct Origin<'a, T> {
  field1: String,
  field2: T,
  field3: &'a str,
}

fn main() {
  let source = Origin {
    field1: "lol".into(),
    field2: 9907,
    field3: "testing",
  };
  // Let's create a `Copied` type from the `Source` (here `CloneFields` shines).
  let copied: Copied<_> = source.clone_into();
  // Now let's clone it using the `add_derives(Clone)`
  let cloned = copied.clone();
  // `assert_eq` requires `Debug` and `PartialEq` traits, which are implemented thanks to
  // `add_derives(Debug, PartialEq)`.
  assert_eq!(copied, cloned);
  // .. and compare it to the source object (thanks `EqFields`!).
  assert_eq!(source, cloned);
  // Ok, let change a field and see that `<` also works (`OrdFields`).
  let greater = Copied {
    field2: source.field2 + 1,
    ..cloned
  };
  assert!(source < greater);
  // ... and vice versa:
  assert!(greater > source);
  // And, finally, let's move `source` into a `Copied` object, conversion sponsored by
  // `MoveFieds`.
  let moved: Copied<_> = source.into();
}

License: MIT/Apache-2.0

Dependencies

~2MB
~45K SLoC