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 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)`
|
/// All attributes that can be used for `derive(BotCommands)`
|
||||||
pub(crate) struct CommandAttrs {
|
pub(crate) struct CommandAttrs {
|
||||||
|
@ -48,9 +49,40 @@ enum CommandAttrKind {
|
||||||
impl CommandAttrs {
|
impl CommandAttrs {
|
||||||
pub fn from_attributes(attributes: &[Attribute]) -> Result<Self> {
|
pub fn from_attributes(attributes: &[Attribute]) -> Result<Self> {
|
||||||
use CommandAttrKind::*;
|
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(
|
fold_attrs(
|
||||||
attributes,
|
attributes.iter(),
|
||||||
is_command_attribute,
|
is_command_attribute,
|
||||||
CommandAttr::parse,
|
CommandAttr::parse,
|
||||||
Self {
|
Self {
|
||||||
|
|
Loading…
Reference in a new issue