diff options
| author | Austin Hellyer <[email protected]> | 2016-11-26 10:40:20 -0800 |
|---|---|---|
| committer | Austin Hellyer <[email protected]> | 2016-11-26 10:40:20 -0800 |
| commit | 5edb49f94ae6c26fa92cebe178c8e3ea59979ed2 (patch) | |
| tree | b06b3648b6753cd1ceccd9441dcb3c61487c08cf | |
| parent | Add Cache::get_guild_channel (diff) | |
| download | serenity-5edb49f94ae6c26fa92cebe178c8e3ea59979ed2.tar.xz serenity-5edb49f94ae6c26fa92cebe178c8e3ea59979ed2.zip | |
Add no-named-argument command macro match
| -rw-r--r-- | examples/06_command_framework.rs | 4 | ||||
| -rw-r--r-- | src/ext/framework/mod.rs | 38 |
2 files changed, 39 insertions, 3 deletions
diff --git a/examples/06_command_framework.rs b/examples/06_command_framework.rs index 1324a2e..af8781c 100644 --- a/examples/06_command_framework.rs +++ b/examples/06_command_framework.rs @@ -43,9 +43,9 @@ fn main() { let _ = client.start(); } -fn cat_command(context: Context, _msg: Message, _args: Vec<String>) { +command!(cat_command(context, _msg, _arg) { let _ = context.say(":cat:"); -} +}); fn dog_command(context: Context, _msg: Message, _args: Vec<String>) { let _ = context.say(":dog:"); diff --git a/src/ext/framework/mod.rs b/src/ext/framework/mod.rs index 39f2148..361fdd8 100644 --- a/src/ext/framework/mod.rs +++ b/src/ext/framework/mod.rs @@ -11,8 +11,44 @@ use std::thread; use ::client::Context; use ::model::Message; +/// A macro to generate "named parameters". This is useful to avoid manually +/// using the "arguments" parameter and manually parsing types. +/// +/// This is meant for use with the command [`Framework`]. +/// +/// # Examples +/// +/// Create a regular `ping` command which takes no arguments: +/// +/// ```rust,ignore +/// command!(ping(_context, message, _args) { +/// if let Err(why) = message.reply("Pong!") { +/// println!("Error sending pong: {:?}", why); +/// } +/// }); +/// ``` +/// +/// Create a command named `multiply` which accepts 2 floats and multiplies +/// them, sending the returned value: +/// +/// ```rust,ignore +/// command!(multiply(_context, message, _args, first: f64, second: f64) { +/// let product = first * second; +/// +/// if let Err(why) = message.reply(&product.to_string()) { +/// println!("Error sending product: {:?}", why); +/// } +/// }); +/// ``` +/// +/// [`Framework`]: ext/framework/index.html #[macro_export] macro_rules! command { + ($fname:ident($c:ident, $m:ident, $a:ident) $b:block) => { + fn $fname($c: Context, $m: Message, $a: Vec<String>) { + $b + } + }; ($fname:ident($c:ident, $m:ident, $a:ident, $($name:ident: $t:ty),*) $b:block) => { fn $fname($c: Context, $m: Message, $a: Vec<String>) { let mut i = $a.iter(); @@ -31,7 +67,7 @@ macro_rules! command { $b } - } + }; } /// The type of command being received. |