cg2 0.4.7

Rust code generator.
Documentation
#[macro_export]
macro_rules! bind {
  ($D:tt $g:ident, declare_const) => {
    $crate::bind!($D $g, declare_const, declare_const);
  };

  ($D:tt $g:ident, declare_fn) => {
    $crate::bind!($D $g, declare_fn, declare_fn);
  };

  ($D:tt $g:ident, declare_const, $macro:ident) => {
    macro_rules! $macro {
      ($vis:vis $name:ident, $ty:ty, $val:expr $D(,)?) => {
        if ::core::stringify!($vis) == "pub" {
          $g.public().space();
        }
        $g.declare_const(::core::stringify!($name), ::core::stringify!($ty), $val)
      };

      ($vis:vis $name:ident, $ty:expr, $val:expr $D(,)?) => {
        if ::core::stringify!($vis) == "pub" {
          $g.public().space();
        }
        $g.declare_const(::core::stringify!($name), $ty, $val)
      };

      ($name:expr, $ty:ty, $val:expr $D(,)?) => {
        $g.declare_const($name, ::core::stringify!($ty), $val)
      };

      ($name:expr, $ty:expr, $val:expr $D(,)?) => {
        $g.declare_const($name, $ty, $val)
      };

      ($vis:vis $name:ident: $ty:ty, $val:expr $D(,)?) => {
        if ::core::stringify!($vis) == "pub" {
          $g.public().space();
        }
        $g.declare_const(::core::stringify!($name), ::core::stringify!($ty), $val)
      };

      ($vis:vis $name:ident: $ty:expr, $val:expr $D(,)?) => {
        if ::core::stringify!($vis) == "pub" {
          $g.public().space();
        }
        $g.declare_const(::core::stringify!($name), $ty, $val)
      };

      ($vis:vis $name:ident, $ty:ty = $val:expr $D(,)?) => {
        if ::core::stringify!($vis) == "pub" {
          $g.public().space();
        }
        $g.declare_const(::core::stringify!($name), ::core::stringify!($ty), $val)
      };

      ($name:expr, $ty:ty = $val:expr $D(,)?) => {
        $g.declare_const($name, ::core::stringify!($ty), $val)
      };

      ($vis:vis $name:ident: $ty:ty = $val:expr $D(,)?) => {
        if ::core::stringify!($vis) == "pub" {
          $g.public().space();
        }
        $g.declare_const(::core::stringify!($name), ::core::stringify!($ty), $val)
      };
    }
  };

  ($D:tt $g:ident, declare_fn, $macro:ident) => {
    macro_rules! $macro {
      ($name:ident ($D($params:tt)*) -> $ret:ty, $body:expr $D(,)?) => {
        $g.declare_fn(
          ::core::stringify!($name),
          ::core::stringify!($D($params)*),
          ::core::stringify!($ret),
          $body,
        )
      };

      ($name:ident ($D($params:tt)*) -> $ret:expr, $body:expr $D(,)?) => {
        $g.declare_fn(::core::stringify!($name), ::core::stringify!($D($params)*), $ret, $body)
      };

      ($name:ident ($D($params:tt)*), $ret:ty, $body:expr $D(,)?) => {
        $g.declare_fn(
          ::core::stringify!($name),
          ::core::stringify!($D($params)*),
          ::core::stringify!($ret),
          $body,
        )
      };

      ($name:ident, $params:expr, $ret:ty, $body:expr $D(,)?) => {
        $g.declare_fn(::core::stringify!($name), $params, ::core::stringify!($ret), $body)
      };

      ($name:ident, $params:expr, $ret:expr, $body:expr $D(,)?) => {
        $g.declare_fn(::core::stringify!($name), $params, $ret, $body)
      };

      ($name:ident ($D($params:tt)*), $ret:expr, $body:expr $D(,)?) => {
        $g.declare_fn(::core::stringify!($name), ::core::stringify!($D($params)*), $ret, $body)
      };

      ($name:expr, $params:expr, $ret:ty, $body:expr $D(,)?) => {
        $g.declare_fn($name, $params, ::core::stringify!($ret), $body)
      };

      ($name:expr, $params:expr, $ret:expr, $body:expr $D(,)?) => {
        $g.declare_fn($name, $params, $ret, $body)
      };
    }
  }
}