Macro syllogism::define_compatibility[][src]

macro_rules! define_compatibility {
    ($dollar :
 tt($(#[$trait_head_meta : meta]) * $trait_head : ident,
    $(#[$macro_head_meta : meta]) * $macro_head : ident),
 $(($(#[$trait_tail_meta : meta]) * $trait_tail : ident,
    $(#[$macro_tail_meta : meta]) * $macro_tail : ident),) *) => { ... };
    (@ inner $dollar :
 tt($(($(#[$trait_head_meta : meta]) * $trait_head : ident,
       $(#[$macro_head_meta : meta]) * $macro_head : ident),) *) @
 ($(#[$trait_current_meta : meta]) * $trait_current : ident,
  $(#[$macro_current_meta : meta]) * $macro_current : ident) @ ()) => { ... };
    (@ inner $dollar :
 tt($(($(#[$trait_head_meta : meta]) * $trait_head : ident,
       $(#[$macro_head_meta : meta]) * $macro_head : ident),) *) @
 ($(#[$trait_current_meta : meta]) * $trait_current : ident,
  $(#[$macro_current_meta : meta]) * $macro_current : ident) @
 (($(#[$trait_next_meta : meta]) * $trait_next : ident,
   $(#[$macro_next_meta : meta]) * $macro_next : ident),
  $(($(#[$trait_tail_meta : meta]) * $trait_tail : ident,
     $(#[$macro_tail_meta : meta]) * $macro_tail : ident),) *)) => { ... };
}
Expand description

A macro to define traits and other macros that help to implement IsNot and Specialize across crates.

The macro expects the dollar symbol (for technical reasons), followed by a comma-separated list of (trait, macro) pairs. The macro expands to definitions of these traits and macros. Each trait and macro may be preceded by a meta attribute (e.g. a doc comment in the form of #[doc=“…”]).

Note

The trailing comma after the last pair is mandatory.

Notes on meta attributes

Meta attributes are only inserted at the declaration of the traits and the macros, so #[cfg(...)] attributes do not work.

Meta attributes may be doc comments starting with ///, as illustrated in the example below.

Example

define_compatibility!(
    $
    (
        /// Lorem ipsum
        NotInCrate1, 

        #[doc(hidden)]
        macro_for_crate1
    ),
    (NotInCrate2, macro_for_crate2),
    (NotInCrate3, macro_for_crate3),
);

This expands to the following:

/// Lorem ipsum
trait NotInCrate1 {}
trait NotInCrate2 {}
trait NotInCrate3 {}

#[doc(hidden)]
macro_rules! macro_for_crate1 {
    // See below for more information.
}
macro_rules! macro_for_crate2 {
    // See below for more information.
}
macro_rules! macro_for_crate3 {
    // See below for more information.
}

The generated macros can in turn be used in the following way:

struct MyStruct {
    // ...
}

struct MyGenericStruct<T> {
    // ...
}

macro_for_crate1!(impl trait for MyStruct {});
macro_for_crate1!(impl<T> trait for MyGenericStruct<T> {});

This expands to the following:

impl NotInCrate2 for MyStruct {}
impl NotInCrate3 for MyStruct {}

impl<T> NotInCrate2 for MyGenericStruct<T> {}
impl<T> NotInCrate3 for MyGenericStruct<T> {}