mirror of
https://github.com/teloxide/teloxide.git
synced 2024-12-23 15:01:45 +01:00
added impl_try_from function
This commit is contained in:
parent
5abaeb2c00
commit
c238906b69
2 changed files with 32 additions and 10 deletions
|
@ -2,6 +2,7 @@ use crate::{
|
|||
attr::{Attr, BotCommandAttribute},
|
||||
rename_rules::rename_by_rule,
|
||||
};
|
||||
use crate::enum_attributes::CommandEnum;
|
||||
|
||||
pub struct Command {
|
||||
pub prefix: Option<String>,
|
||||
|
@ -30,6 +31,17 @@ impl Command {
|
|||
renamed,
|
||||
})
|
||||
}
|
||||
|
||||
pub fn get_matched_value(&self, global_parameters: &CommandEnum) -> String {
|
||||
let prefix = if let Some(prefix) = &self.prefix {
|
||||
prefix
|
||||
} else if let Some(prefix) = &global_parameters.prefix {
|
||||
prefix
|
||||
} else {
|
||||
"/"
|
||||
};
|
||||
String::from(prefix) + &self.name
|
||||
}
|
||||
}
|
||||
|
||||
struct CommandAttrs {
|
||||
|
|
30
src/lib.rs
30
src/lib.rs
|
@ -13,7 +13,7 @@ use crate::{
|
|||
};
|
||||
use proc_macro::TokenStream;
|
||||
use quote::{quote, ToTokens};
|
||||
use syn::{parse_macro_input, DeriveInput};
|
||||
use syn::{parse_macro_input, DeriveInput, Variant};
|
||||
|
||||
macro_rules! get_or_return {
|
||||
($($some:tt)*) => {
|
||||
|
@ -58,7 +58,6 @@ pub fn derive_telegram_command_enum(tokens: TokenStream) -> TokenStream {
|
|||
}
|
||||
}
|
||||
|
||||
let variant_ident = variants.iter().map(|variant| &variant.ident);
|
||||
let variant_name = variant_infos.iter().map(|info| {
|
||||
if info.renamed {
|
||||
info.name.clone()
|
||||
|
@ -96,16 +95,11 @@ pub fn derive_telegram_command_enum(tokens: TokenStream) -> TokenStream {
|
|||
quote! {}
|
||||
};
|
||||
|
||||
let fn_try_from = impl_try_parse_command(&variants, &variant_infos, &command_enum);
|
||||
|
||||
let expanded = quote! {
|
||||
impl BotCommand for #ident {
|
||||
fn try_from(value: &str) -> Option<Self> {
|
||||
match value {
|
||||
#(
|
||||
#variant_str1 => Some(Self::#variant_ident),
|
||||
)*
|
||||
_ => None
|
||||
}
|
||||
}
|
||||
#fn_try_from
|
||||
fn descriptions() -> String {
|
||||
std::concat!(#global_description #(#variant_str2, #variant_description, '\n'),*).to_string()
|
||||
}
|
||||
|
@ -133,6 +127,22 @@ pub fn derive_telegram_command_enum(tokens: TokenStream) -> TokenStream {
|
|||
TokenStream::from(expanded)
|
||||
}
|
||||
|
||||
fn impl_try_parse_command(variants: &[&Variant], infos: &[Command], global: &CommandEnum) -> impl ToTokens {
|
||||
let matching_values = infos.iter().map(|c| c.get_matched_value(global));
|
||||
let variant_ident = variants.iter().map(|variant| &variant.ident);
|
||||
|
||||
quote! {
|
||||
fn try_from(value: &str) -> Option<Self> {
|
||||
match value {
|
||||
#(
|
||||
#matching_values => Some(Self::#variant_ident),
|
||||
)*
|
||||
_ => None
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn get_enum_data(input: &DeriveInput) -> Result<&syn::DataEnum, TokenStream> {
|
||||
match &input.data {
|
||||
syn::Data::Enum(data) => Ok(data),
|
||||
|
|
Loading…
Reference in a new issue