#[derive(CloneFields)]
{
    // Attributes available to this derive:
    #[destinations]
}
Expand description

A derive macro for CloneInto and CloneFrom traits.

To automagically derive the traits for your type against a DesiredTypeName add the following attributes to it:

  • #[derive(CloneFields)],
  • and #[destinations("DesiredTypeName")].

… and the macro will generate an implementations of CloneInto<DesiredTypeName> and CloneFrom<DesiredTypeName> for you type then.

You can add more than one type, like #[destinations("Type1", "Type2", ...)].

It is possible to use structs with fields with different types, the only requirement is that respective types should be “clonable” with the CloneFrom and CloneInto traits.

Please refer to clone-fields docs for more info on why do you ;) implied you need it

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

mod ext {
  #[derive(Debug)]
  pub struct ExternalType<'a, T> {
    pub field1: String,
    pub field2: T,
    pub field3: &'a str,
  }
}

#[derive(CloneFields, Debug)]
#[destinations("ext::ExternalType")]
struct MyType<'a, T> {
  field1: String,
  field2: T,
  field3: &'a str,
}

fn main() {
  let source = ext::ExternalType {
    field1: "lol".into(),
    field2: 9907,
    field3: "testing",
  };
  let my: MyType<_> = source.clone_into();
  assert_eq!(my.field1, source.field1);
  assert_eq!(my.field2, source.field2);
  assert_eq!(my.field3, source.field3);
}