mirror of
https://github.com/teloxide/teloxide.git
synced 2024-12-22 22:46:39 +01:00
Replace #[doc = ".."]
with #[command(description = "...")]
This commit is contained in:
parent
47ad84c17e
commit
65baf3fcd3
1 changed files with 34 additions and 2 deletions
|
@ -7,7 +7,8 @@ use crate::{
|
|||
};
|
||||
|
||||
use proc_macro2::Span;
|
||||
use syn::Attribute;
|
||||
use quote::quote_spanned;
|
||||
use syn::{parse::Parser, spanned::Spanned, Attribute};
|
||||
|
||||
/// All attributes that can be used for `derive(BotCommands)`
|
||||
pub(crate) struct CommandAttrs {
|
||||
|
@ -48,9 +49,40 @@ enum CommandAttrKind {
|
|||
impl CommandAttrs {
|
||||
pub fn from_attributes(attributes: &[Attribute]) -> Result<Self> {
|
||||
use CommandAttrKind::*;
|
||||
// Convert the `doc` attribute into `command(description = "...")`
|
||||
let attributes = attributes
|
||||
.iter()
|
||||
.map(|attr| {
|
||||
if attr.path.is_ident("doc") {
|
||||
// Extract the token literal from the doc attribute.
|
||||
let description = attr
|
||||
.tokens
|
||||
.clone()
|
||||
.into_iter()
|
||||
.nth(1)
|
||||
.map(|t| {
|
||||
// remove first and last quotes only, is expected to be a string literal
|
||||
let mut s = t.to_string();
|
||||
s.remove(0);
|
||||
s.pop();
|
||||
s.trim().replace(r"\\n", "\n")
|
||||
})
|
||||
.unwrap_or_default();
|
||||
// Convert the doc attribute into a command description attribute.
|
||||
let sp = attr.span();
|
||||
let attr = Attribute::parse_outer
|
||||
.parse2(quote_spanned!(sp => #[command(description = #description)]))
|
||||
.unwrap();
|
||||
// SAFETY: `parse_outer` always returns a single attribute.
|
||||
attr.into_iter().next().unwrap()
|
||||
} else {
|
||||
attr.clone()
|
||||
}
|
||||
})
|
||||
.collect::<Vec<_>>();
|
||||
|
||||
fold_attrs(
|
||||
attributes,
|
||||
attributes.iter(),
|
||||
is_command_attribute,
|
||||
CommandAttr::parse,
|
||||
Self {
|
||||
|
|
Loading…
Reference in a new issue