.github/workflows | ||
src | ||
.gitignore | ||
Cargo.toml | ||
CHANGELOG.md | ||
LICENSE | ||
Readme.md |
teloxide-macros
The teloxide's procedural macros.
Example
use teloxide::utils::command::BotCommand;
type UnitOfTime = u8;
#[derive(BotCommand, PartialEq, Debug)]
#[command(rename = "lowercase", parse_with = "split")]
enum AdminCommand {
Mute(UnitOfTime, char),
Ban(UnitOfTime, char),
}
let command = AdminCommand::parse("/ban 5 h", "bot_name").unwrap();
assert_eq!(command, AdminCommand::Ban(5, 'h'));
Enum attributes
-
#[command(rename = "rule")]
Rename all commands byrule
. Allowed rules arelowercase
. If you will not use this attribute, commands will be parsed by their original names. -
#[command(prefix = "prefix")]
Change a prefix for all commands (the default is/
). -
#[command(description = "description")]
Add a sumary description of commands before all commands. -
#[command(parse_with = "parser")]
Change the parser of arguments. Possible values:
default
- the same as the unspecified parser. It only puts all text after the first space into the first argument, which must implementFromStr
.
Example
use teloxide::utils::command::BotCommand;
#[derive(BotCommand, PartialEq, Debug)]
#[command(rename = "lowercase")]
enum Command {
Text(String),
}
let command = Command::parse("/text hello my dear friend!", "").unwrap();
assert_eq!(command, Command::Text("hello my dear friend!".to_string()));
split
- separates a messsage by a given separator (the default is the space character) and parses each part into the corresponding arguments, which must implementFromStr
.
Example
use teloxide::utils::command::BotCommand;
#[derive(BotCommand, PartialEq, Debug)]
#[command(rename = "lowercase", parse_with = "split")]
enum Command {
Nums(u8, u16, i32),
}
let command = Command::parse("/nums 1 32 -5", "").unwrap();
assert_eq!(command, Command::Nums(1, 32, -5));
#[command(separator = "sep")]
Specify separator used by thesplit
parser. It will be ignored when accompanied by another type of parsers.
Example
use teloxide::utils::command::BotCommand;
#[derive(BotCommand, PartialEq, Debug)]
#[command(rename = "lowercase", parse_with = "split", separator = "|")]
enum Command {
Nums(u8, u16, i32),
}
let command = Command::parse("/nums 1|32|5", "").unwrap();
assert_eq!(command, Command::Nums(1, 32, 5));
Variant attributes
All variant attributes override the corresponding enum
attributes.
-
#[command(rename = "rule")]
Rename one command by a rule. Allowed rules arelowercase
,%some_name%
, where%some_name%
is any string, a new name. -
#[command(parse_with = "parser")]
One more option is available for variants.
custom_parser
- your own parser of the signaturefn(String) -> Result<Tuple, ParseError>
, whereTuple
corresponds to the variant's arguments.
Example
use teloxide::utils::command::{BotCommand, ParseError};
fn accept_two_digits(input: String) -> Result<(u8,), ParseError> {
match input.len() {
2 => {
let num = input
.parse::<u8>()
.map_err(|e| ParseError::IncorrectFormat(e.into()))?;
Ok((num,))
}
len => Err(ParseError::Custom(
format!("Only 2 digits allowed, not {}", len).into(),
)),
}
}
#[derive(BotCommand, PartialEq, Debug)]
#[command(rename = "lowercase")]
enum Command {
#[command(parse_with = "accept_two_digits")]
Num(u8),
}
let command = Command::parse("/num 12", "").unwrap();
assert_eq!(command, Command::Num(12));
let command = Command::parse("/num 333", "");
assert!(command.is_err());
#[command(prefix = "prefix")]
#[command(description = "description")]
#[command(separator = "sep")]
Analogous to the descriptions above.