1use proc_macro2::{Ident, Span, TokenStream};
16use quote::{format_ident, quote, quote_spanned};
17use syn::{Data, DeriveInput, FieldsUnnamed, Generics, Variant, spanned::Spanned};
18
19use crate::derives::args;
20use crate::derives::args::collect_args_fields;
21use crate::item::{Item, Kind, Name};
22use crate::utils::{is_simple_ty, subty_if_name};
23
24pub(crate) fn derive_subcommand(input: &DeriveInput) -> Result<TokenStream, syn::Error> {
25 let ident = &input.ident;
26
27 match input.data {
28 Data::Enum(ref e) => {
29 let name = Name::Derived(ident.clone());
30 let item = Item::from_subcommand_enum(input, name)?;
31 let variants = e
32 .variants
33 .iter()
34 .map(|variant| {
35 let item =
36 Item::from_subcommand_variant(variant, item.casing(), item.env_casing())?;
37 Ok((variant, item))
38 })
39 .collect::<Result<Vec<_>, syn::Error>>()?;
40 gen_for_enum(&item, ident, &input.generics, &variants)
41 }
42 _ => {
let span = proc_macro2::Span::call_site();
{
return Err({
#[allow(unused_imports)]
use crate::utils::error::*;
let msg =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`#[derive(Subcommand)]` only supports enums"))
});
span.EXPECTED_Span_OR_ToTokens(msg)
});
}
}abort_call_site!("`#[derive(Subcommand)]` only supports enums"),
43 }
44}
45
46pub(crate) fn gen_for_enum(
47 item: &Item,
48 item_name: &Ident,
49 generics: &Generics,
50 variants: &[(&Variant, Item)],
51) -> Result<TokenStream, syn::Error> {
52 if !#[allow(non_exhaustive_omitted_patterns)] match &*item.kind() {
Kind::Command(_) => true,
_ => false,
}matches!(&*item.kind(), Kind::Command(_)) {
53 {
return Err({
#[allow(unused_imports)]
use crate::utils::error::*;
let msg =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`{0}` cannot be used with `#[command]`",
item.kind().name()))
});
item.kind().span().EXPECTED_Span_OR_ToTokens(msg)
});
}abort! { item.kind().span(),
54 "`{}` cannot be used with `#[command]`",
55 item.kind().name(),
56 }
57 }
58
59 let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
60
61 let from_arg_matches = gen_from_arg_matches(variants)?;
62 let update_from_arg_matches = gen_update_from_arg_matches(variants)?;
63
64 let augmentation = gen_augment(variants, item, false)?;
65 let augmentation_update = gen_augment(variants, item, true)?;
66 let has_subcommand = gen_has_subcommand(variants)?;
67
68 Ok({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "allow");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "dead_code");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "unreachable_code");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "unused_variables");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "unused_braces");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s,
"unused_qualifications");
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "allow");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "style");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "complexity");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "pedantic");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "restriction");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "perf");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "deprecated");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "nursery");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "cargo");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"suspicious_else_formatting");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "almost_swapped");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "redundant_locals");
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "automatically_derived");
_s
});
::quote::__private::push_ident(&mut _s, "impl");
::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "FromArgMatches");
::quote::__private::push_ident(&mut _s, "for");
::quote::ToTokens::to_tokens(&item_name, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::ToTokens::to_tokens(&where_clause, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "from_arg_matches");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__clap_arg_matches");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ArgMatches");
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "std");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "Self");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Error");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "Self");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"from_arg_matches_mut");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s,
"__clap_arg_matches");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "clone");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
});
_s
});
::quote::ToTokens::to_tokens(&from_arg_matches, &mut _s);
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s,
"update_from_arg_matches");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s,
"__clap_arg_matches");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ArgMatches");
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "std");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Error");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s,
"update_from_arg_matches_mut");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s,
"__clap_arg_matches");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "clone");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
});
_s
});
::quote::ToTokens::to_tokens(&update_from_arg_matches, &mut _s);
_s
});
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "allow");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "dead_code");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "unreachable_code");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "unused_variables");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "unused_braces");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s,
"unused_qualifications");
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "allow");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "style");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "complexity");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "pedantic");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "restriction");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "perf");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "deprecated");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "nursery");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "cargo");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"suspicious_else_formatting");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "almost_swapped");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "clippy");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "redundant_locals");
::quote::__private::push_comma(&mut _s);
_s
});
_s
});
::quote::__private::push_pound(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Bracket,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "automatically_derived");
_s
});
::quote::__private::push_ident(&mut _s, "impl");
::quote::ToTokens::to_tokens(&impl_generics, &mut _s);
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Subcommand");
::quote::__private::push_ident(&mut _s, "for");
::quote::ToTokens::to_tokens(&item_name, &mut _s);
::quote::ToTokens::to_tokens(&ty_generics, &mut _s);
::quote::ToTokens::to_tokens(&where_clause, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "augment_subcommands");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'b");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__clap_app");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Command");
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Command");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&augmentation, &mut _s);
_s
});
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s,
"augment_subcommands_for_update");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'b");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__clap_app");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Command");
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Command");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&augmentation_update, &mut _s);
_s
});
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "has_subcommand");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__clap_name");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "str");
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_ident(&mut _s, "bool");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&has_subcommand, &mut _s);
_s
});
_s
});
_s
}quote! {
69 #[allow(
70 dead_code,
71 unreachable_code,
72 unused_variables,
73 unused_braces,
74 unused_qualifications,
75 )]
76 #[allow(
77 clippy::style,
78 clippy::complexity,
79 clippy::pedantic,
80 clippy::restriction,
81 clippy::perf,
82 clippy::deprecated,
83 clippy::nursery,
84 clippy::cargo,
85 clippy::suspicious_else_formatting,
86 clippy::almost_swapped,
87 clippy::redundant_locals,
88 )]
89 #[automatically_derived]
90 impl #impl_generics clap::FromArgMatches for #item_name #ty_generics #where_clause {
91 fn from_arg_matches(__clap_arg_matches: &clap::ArgMatches) -> ::std::result::Result<Self, clap::Error> {
92 Self::from_arg_matches_mut(&mut __clap_arg_matches.clone())
93 }
94
95 #from_arg_matches
96
97 fn update_from_arg_matches(&mut self, __clap_arg_matches: &clap::ArgMatches) -> ::std::result::Result<(), clap::Error> {
98 self.update_from_arg_matches_mut(&mut __clap_arg_matches.clone())
99 }
100 #update_from_arg_matches
101 }
102
103 #[allow(
104 dead_code,
105 unreachable_code,
106 unused_variables,
107 unused_braces,
108 unused_qualifications,
109 )]
110 #[allow(
111 clippy::style,
112 clippy::complexity,
113 clippy::pedantic,
114 clippy::restriction,
115 clippy::perf,
116 clippy::deprecated,
117 clippy::nursery,
118 clippy::cargo,
119 clippy::suspicious_else_formatting,
120 clippy::almost_swapped,
121 clippy::redundant_locals,
122 )]
123 #[automatically_derived]
124 impl #impl_generics clap::Subcommand for #item_name #ty_generics #where_clause {
125 fn augment_subcommands <'b>(__clap_app: clap::Command) -> clap::Command {
126 #augmentation
127 }
128 fn augment_subcommands_for_update <'b>(__clap_app: clap::Command) -> clap::Command {
129 #augmentation_update
130 }
131 fn has_subcommand(__clap_name: &str) -> bool {
132 #has_subcommand
133 }
134 }
135 })
136}
137
138fn gen_augment(
139 variants: &[(&Variant, Item)],
140 parent_item: &Item,
141 override_required: bool,
142) -> Result<TokenStream, syn::Error> {
143 use syn::Fields::{Named, Unit, Unnamed};
144
145 let app_var = Ident::new("__clap_app", Span::call_site());
146
147 let mut subcommands = Vec::new();
148 for (variant, item) in variants {
149 let kind = item.kind();
150
151 let genned = match &*kind {
152 Kind::Skip(_, _) | Kind::Arg(_) | Kind::FromGlobal(_) | Kind::Value => None,
153
154 Kind::ExternalSubcommand => {
155 let ty = match variant.fields {
156 Unnamed(ref fields) if fields.unnamed.len() == 1 => &fields.unnamed[0].ty,
157
158 _ => {
return Err({
#[allow(unused_imports)]
use crate::utils::error::*;
let msg =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid type for `#[command(external_subcommand)]`, expected a newtype variant with either a `Vec<String>` or `Vec<OsString>`"))
});
variant.EXPECTED_Span_OR_ToTokens(msg)
});
}abort!(
159 variant,
160 "invalid type for `#[command(external_subcommand)]`, expected a newtype variant with either a `Vec<String>` or `Vec<OsString>`"
161 ),
162 };
163 let deprecations = if !override_required {
164 item.deprecations()
165 } else {
166 ::quote::__private::TokenStream::new()quote!()
167 };
168 let subty = subty_if_name(ty, "Vec").ok_or_else(|| {
169 {
#[allow(unused_imports)]
use crate::utils::error::*;
let msg =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid type for `#[command(external_subcommand)]`, expected a `Vec<_>`"))
});
ty.span().EXPECTED_Span_OR_ToTokens(msg)
}format_err!(
170 ty.span(),
171 "invalid type for `#[command(external_subcommand)]`, expected a `Vec<_>`"
172 )
173 })?;
174 let subcommand = {
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(kind.span()).__into_span();
::quote::ToTokens::to_tokens(&deprecations, &mut _s);
::quote::__private::push_ident_spanned(&mut _s, _span, "let");
::quote::ToTokens::to_tokens(&app_var, &mut _s);
::quote::__private::push_eq_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&app_var, &mut _s);
::quote::__private::push_dot_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"external_subcommand_value_parser");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(_span).__into_span();
::quote::__private::push_ident_spanned(&mut _s, _span, "clap");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"value_parser");
::quote::__private::push_bang_spanned(&mut _s, _span);
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
let _: ::quote::__private::Span =
::quote::__private::get_span(_span).__into_span();
::quote::ToTokens::to_tokens(&subty, &mut _s);
_s
});
_s
});
::quote::__private::push_semi_spanned(&mut _s, _span);
_s
}quote_spanned! { kind.span()=>
175 #deprecations
176 let #app_var = #app_var
177 .external_subcommand_value_parser(clap::value_parser!(#subty));
178 };
179 Some(subcommand)
180 }
181
182 Kind::Flatten(_) => match variant.fields {
183 Unnamed(FieldsUnnamed { ref unnamed, .. }) if unnamed.len() == 1 => {
184 let ty = &unnamed[0].ty;
185 let deprecations = if !override_required {
186 item.deprecations()
187 } else {
188 ::quote::__private::TokenStream::new()quote!()
189 };
190 let next_help_heading = item.next_help_heading();
191 let next_display_order = item.next_display_order();
192 let subcommand = if override_required {
193 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&deprecations, &mut _s);
::quote::__private::push_ident(&mut _s, "let");
::quote::ToTokens::to_tokens(&app_var, &mut _s);
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&app_var, &mut _s);
::quote::ToTokens::to_tokens(&next_help_heading, &mut _s);
::quote::ToTokens::to_tokens(&next_display_order, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "let");
::quote::ToTokens::to_tokens(&app_var, &mut _s);
::quote::__private::push_eq(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::__private::push_ident(&mut _s, "as");
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Subcommand");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "augment_subcommands_for_update");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&app_var, &mut _s);
_s
});
::quote::__private::push_semi(&mut _s);
_s
}quote! {
194 #deprecations
195 let #app_var = #app_var
196 #next_help_heading
197 #next_display_order;
198 let #app_var = <#ty as clap::Subcommand>::augment_subcommands_for_update(#app_var);
199 }
200 } else {
201 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&deprecations, &mut _s);
::quote::__private::push_ident(&mut _s, "let");
::quote::ToTokens::to_tokens(&app_var, &mut _s);
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&app_var, &mut _s);
::quote::ToTokens::to_tokens(&next_help_heading, &mut _s);
::quote::ToTokens::to_tokens(&next_display_order, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "let");
::quote::ToTokens::to_tokens(&app_var, &mut _s);
::quote::__private::push_eq(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::__private::push_ident(&mut _s, "as");
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Subcommand");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "augment_subcommands");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&app_var, &mut _s);
_s
});
::quote::__private::push_semi(&mut _s);
_s
}quote! {
202 #deprecations
203 let #app_var = #app_var
204 #next_help_heading
205 #next_display_order;
206 let #app_var = <#ty as clap::Subcommand>::augment_subcommands(#app_var);
207 }
208 };
209 Some(subcommand)
210 }
211 _ => {
return Err({
#[allow(unused_imports)]
use crate::utils::error::*;
let msg =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid variant for `#[command(flatten)]`, expected a newtype variant"))
});
variant.EXPECTED_Span_OR_ToTokens(msg)
});
}abort!(
212 variant,
213 "invalid variant for `#[command(flatten)]`, expected a newtype variant"
214 ),
215 },
216
217 Kind::Subcommand(_) => {
218 let subcommand_var = Ident::new("__clap_subcommand", Span::call_site());
219 let arg_block = match variant.fields {
220 Named(_) => {
221 {
return Err({
#[allow(unused_imports)]
use crate::utils::error::*;
let msg =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid variant for `#[command(subcommand)]`, expected a newtype variant"))
});
variant.EXPECTED_Span_OR_ToTokens(msg)
});
}abort!(
222 variant,
223 "invalid variant for `#[command(subcommand)]`, expected a newtype variant"
224 )
225 }
226 Unit => {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&subcommand_var, &mut _s);
_s
}quote!( #subcommand_var ),
227 Unnamed(FieldsUnnamed { ref unnamed, .. }) if unnamed.len() == 1 => {
228 let ty = &unnamed[0].ty;
229 if override_required {
230 {
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(ty.span()).__into_span();
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(_span).__into_span();
::quote::__private::push_lt_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::__private::push_ident_spanned(&mut _s, _span, "as");
::quote::__private::push_ident_spanned(&mut _s, _span, "clap");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"Subcommand");
::quote::__private::push_gt_spanned(&mut _s, _span);
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"augment_subcommands_for_update");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
let _: ::quote::__private::Span =
::quote::__private::get_span(_span).__into_span();
::quote::ToTokens::to_tokens(&subcommand_var, &mut _s);
_s
});
_s
});
_s
}quote_spanned! { ty.span()=>
231 {
232 <#ty as clap::Subcommand>::augment_subcommands_for_update(#subcommand_var)
233 }
234 }
235 } else {
236 {
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(ty.span()).__into_span();
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(_span).__into_span();
::quote::__private::push_lt_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::__private::push_ident_spanned(&mut _s, _span, "as");
::quote::__private::push_ident_spanned(&mut _s, _span, "clap");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"Subcommand");
::quote::__private::push_gt_spanned(&mut _s, _span);
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"augment_subcommands");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
let _: ::quote::__private::Span =
::quote::__private::get_span(_span).__into_span();
::quote::ToTokens::to_tokens(&subcommand_var, &mut _s);
_s
});
_s
});
_s
}quote_spanned! { ty.span()=>
237 {
238 <#ty as clap::Subcommand>::augment_subcommands(#subcommand_var)
239 }
240 }
241 }
242 }
243 Unnamed(..) => {
244 {
return Err({
#[allow(unused_imports)]
use crate::utils::error::*;
let msg =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid variant for `#[command(subcommand)]`, expected a newtype variant"))
});
variant.EXPECTED_Span_OR_ToTokens(msg)
});
}abort!(
245 variant,
246 "invalid variant for `#[command(subcommand)]`, expected a newtype variant"
247 )
248 }
249 };
250
251 let name = item.cased_name();
252 let deprecations = if !override_required {
253 item.deprecations()
254 } else {
255 ::quote::__private::TokenStream::new()quote!()
256 };
257 let initial_app_methods = item.initial_top_level_methods();
258 let final_from_attrs = item.final_top_level_methods();
259 let override_methods = if override_required {
260 {
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(kind.span()).__into_span();
::quote::__private::push_dot_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"subcommand_required");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(_span).__into_span();
::quote::__private::push_ident_spanned(&mut _s, _span, "false");
_s
});
::quote::__private::push_dot_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"arg_required_else_help");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(_span).__into_span();
::quote::__private::push_ident_spanned(&mut _s, _span, "false");
_s
});
_s
}quote_spanned! { kind.span()=>
261 .subcommand_required(false)
262 .arg_required_else_help(false)
263 }
264 } else {
265 ::quote::__private::TokenStream::new()quote!()
266 };
267 let subcommand = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::ToTokens::to_tokens(&app_var, &mut _s);
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&app_var, &mut _s);
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "subcommand");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&deprecations, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "let");
::quote::ToTokens::to_tokens(&subcommand_var, &mut _s);
::quote::__private::push_eq(&mut _s);
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Command");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "new");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&name, &mut _s);
_s
});
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "let");
::quote::ToTokens::to_tokens(&subcommand_var, &mut _s);
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&subcommand_var, &mut _s);
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s,
"subcommand_required");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "true");
_s
});
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s,
"arg_required_else_help");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "true");
_s
});
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "let");
::quote::ToTokens::to_tokens(&subcommand_var, &mut _s);
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&subcommand_var, &mut _s);
::quote::ToTokens::to_tokens(&initial_app_methods, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "let");
::quote::ToTokens::to_tokens(&subcommand_var, &mut _s);
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&arg_block, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::ToTokens::to_tokens(&subcommand_var, &mut _s);
::quote::ToTokens::to_tokens(&final_from_attrs, &mut _s);
::quote::ToTokens::to_tokens(&override_methods, &mut _s);
_s
});
_s
});
::quote::__private::push_semi(&mut _s);
_s
}quote! {
268 let #app_var = #app_var.subcommand({
269 #deprecations;
270 let #subcommand_var = clap::Command::new(#name);
271 let #subcommand_var = #subcommand_var
272 .subcommand_required(true)
273 .arg_required_else_help(true);
274 let #subcommand_var = #subcommand_var #initial_app_methods;
275 let #subcommand_var = #arg_block;
276 #subcommand_var #final_from_attrs #override_methods
277 });
278 };
279 Some(subcommand)
280 }
281
282 Kind::Command(_) => {
283 let subcommand_var = Ident::new("__clap_subcommand", Span::call_site());
284 let sub_augment = match variant.fields {
285 Named(ref fields) => {
286 let fields = collect_args_fields(item, fields)?;
288 args::gen_augment(&fields, &subcommand_var, item, override_required)?
289 }
290 Unit => {
291 let arg_block = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&subcommand_var, &mut _s);
_s
}quote!( #subcommand_var );
292 let initial_app_methods = item.initial_top_level_methods();
293 let final_from_attrs = item.final_top_level_methods();
294 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::ToTokens::to_tokens(&subcommand_var, &mut _s);
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&subcommand_var, &mut _s);
::quote::ToTokens::to_tokens(&initial_app_methods, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "let");
::quote::ToTokens::to_tokens(&subcommand_var, &mut _s);
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&arg_block, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::ToTokens::to_tokens(&subcommand_var, &mut _s);
::quote::ToTokens::to_tokens(&final_from_attrs, &mut _s);
_s
}quote! {
295 let #subcommand_var = #subcommand_var #initial_app_methods;
296 let #subcommand_var = #arg_block;
297 #subcommand_var #final_from_attrs
298 }
299 }
300 Unnamed(FieldsUnnamed { ref unnamed, .. }) if unnamed.len() == 1 => {
301 let ty = &unnamed[0].ty;
302 let arg_block = if override_required {
303 {
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(ty.span()).__into_span();
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(_span).__into_span();
::quote::__private::push_lt_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::__private::push_ident_spanned(&mut _s, _span, "as");
::quote::__private::push_ident_spanned(&mut _s, _span, "clap");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "Args");
::quote::__private::push_gt_spanned(&mut _s, _span);
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"augment_args_for_update");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
let _: ::quote::__private::Span =
::quote::__private::get_span(_span).__into_span();
::quote::ToTokens::to_tokens(&subcommand_var, &mut _s);
_s
});
_s
});
_s
}quote_spanned! { ty.span()=>
304 {
305 <#ty as clap::Args>::augment_args_for_update(#subcommand_var)
306 }
307 }
308 } else {
309 {
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(ty.span()).__into_span();
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(_span).__into_span();
::quote::__private::push_lt_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::__private::push_ident_spanned(&mut _s, _span, "as");
::quote::__private::push_ident_spanned(&mut _s, _span, "clap");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "Args");
::quote::__private::push_gt_spanned(&mut _s, _span);
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"augment_args");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
let _: ::quote::__private::Span =
::quote::__private::get_span(_span).__into_span();
::quote::ToTokens::to_tokens(&subcommand_var, &mut _s);
_s
});
_s
});
_s
}quote_spanned! { ty.span()=>
310 {
311 <#ty as clap::Args>::augment_args(#subcommand_var)
312 }
313 }
314 };
315 let initial_app_methods = item.initial_top_level_methods();
316 let final_from_attrs = item.final_top_level_methods();
317 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::ToTokens::to_tokens(&subcommand_var, &mut _s);
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&subcommand_var, &mut _s);
::quote::ToTokens::to_tokens(&initial_app_methods, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "let");
::quote::ToTokens::to_tokens(&subcommand_var, &mut _s);
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&arg_block, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::ToTokens::to_tokens(&subcommand_var, &mut _s);
::quote::ToTokens::to_tokens(&final_from_attrs, &mut _s);
_s
}quote! {
318 let #subcommand_var = #subcommand_var #initial_app_methods;
319 let #subcommand_var = #arg_block;
320 #subcommand_var #final_from_attrs
321 }
322 }
323 Unnamed(..) => {
324 {
return Err({
#[allow(unused_imports)]
use crate::utils::error::*;
let msg =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid variant for `#[command(subcommand)]`, expected a newtype variant"))
});
variant.EXPECTED_Span_OR_ToTokens(msg)
});
}abort!(
325 variant,
326 "invalid variant for `#[command(subcommand)]`, expected a newtype variant"
327 )
328 }
329 };
330
331 let deprecations = if !override_required {
332 item.deprecations()
333 } else {
334 ::quote::__private::TokenStream::new()quote!()
335 };
336 let name = item.cased_name();
337 let subcommand = {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::ToTokens::to_tokens(&app_var, &mut _s);
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&app_var, &mut _s);
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "subcommand");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&deprecations, &mut _s);
::quote::__private::push_ident(&mut _s, "let");
::quote::ToTokens::to_tokens(&subcommand_var, &mut _s);
::quote::__private::push_eq(&mut _s);
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Command");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "new");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&name, &mut _s);
_s
});
::quote::__private::push_semi(&mut _s);
::quote::ToTokens::to_tokens(&sub_augment, &mut _s);
_s
});
_s
});
::quote::__private::push_semi(&mut _s);
_s
}quote! {
338 let #app_var = #app_var.subcommand({
339 #deprecations
340 let #subcommand_var = clap::Command::new(#name);
341 #sub_augment
342 });
343 };
344 Some(subcommand)
345 }
346 };
347 subcommands.push(genned);
348 }
349
350 let deprecations = if !override_required {
351 parent_item.deprecations()
352 } else {
353 ::quote::__private::TokenStream::new()quote!()
354 };
355 let initial_app_methods = parent_item.initial_top_level_methods();
356 let final_app_methods = parent_item.final_top_level_methods();
357 Ok({
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&deprecations, &mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "let");
::quote::ToTokens::to_tokens(&app_var, &mut _s);
::quote::__private::push_eq(&mut _s);
::quote::ToTokens::to_tokens(&app_var, &mut _s);
::quote::ToTokens::to_tokens(&initial_app_methods, &mut _s);
::quote::__private::push_semi(&mut _s);
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut subcommands, i) = subcommands.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let subcommands =
match subcommands.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&subcommands, &mut _s);
}
}
::quote::__private::push_semi(&mut _s);
::quote::ToTokens::to_tokens(&app_var, &mut _s);
::quote::ToTokens::to_tokens(&final_app_methods, &mut _s);
_s
}quote! {
358 #deprecations;
359 let #app_var = #app_var #initial_app_methods;
360 #( #subcommands )*;
361 #app_var #final_app_methods
362 })
363}
364
365fn gen_has_subcommand(variants: &[(&Variant, Item)]) -> Result<TokenStream, syn::Error> {
366 use syn::Fields::Unnamed;
367
368 let mut ext_subcmd = false;
369
370 let (flatten_variants, variants): (Vec<_>, Vec<_>) = variants
371 .iter()
372 .filter_map(|(variant, item)| {
373 let kind = item.kind();
374 match &*kind {
375 Kind::Skip(_, _) | Kind::Arg(_) | Kind::FromGlobal(_) | Kind::Value => None,
376
377 Kind::ExternalSubcommand => {
378 ext_subcmd = true;
379 None
380 }
381 Kind::Flatten(_) | Kind::Subcommand(_) | Kind::Command(_) => Some((variant, item)),
382 }
383 })
384 .partition(|(_, item)| {
385 let kind = item.kind();
386 #[allow(non_exhaustive_omitted_patterns)] match &*kind {
Kind::Flatten(_) => true,
_ => false,
}matches!(&*kind, Kind::Flatten(_))
387 });
388
389 let subcommands = variants.iter().map(|(_variant, item)| {
390 let sub_name = item.cased_name();
391 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "if");
::quote::ToTokens::to_tokens(&sub_name, &mut _s);
::quote::__private::push_eq_eq(&mut _s);
::quote::__private::push_ident(&mut _s, "__clap_name");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "return");
::quote::__private::push_ident(&mut _s, "true");
_s
});
_s
}quote! {
392 if #sub_name == __clap_name {
393 return true
394 }
395 }
396 });
397 let child_subcommands = flatten_variants
398 .iter()
399 .map(|(variant, _attrs)| match variant.fields {
400 Unnamed(ref fields) if fields.unnamed.len() == 1 => {
401 let ty = &fields.unnamed[0].ty;
402 Ok({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "if");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::__private::push_ident(&mut _s, "as");
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Subcommand");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "has_subcommand");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__clap_name");
_s
});
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "return");
::quote::__private::push_ident(&mut _s, "true");
::quote::__private::push_semi(&mut _s);
_s
});
_s
}quote! {
403 if <#ty as clap::Subcommand>::has_subcommand(__clap_name) {
404 return true;
405 }
406 })
407 }
408 _ => {
return Err({
#[allow(unused_imports)]
use crate::utils::error::*;
let msg =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid variant for `#[command(flatten)]`, expected newtype variant"))
});
variant.EXPECTED_Span_OR_ToTokens(msg)
});
}abort!(
409 variant,
410 "invalid variant for `#[command(flatten)]`, expected newtype variant"
411 ),
412 })
413 .collect::<Result<Vec<_>, syn::Error>>()?;
414
415 let genned = if ext_subcmd {
416 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "true");
_s
}quote! { true }
417 } else {
418 {
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut subcommands, i) = subcommands.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let subcommands =
match subcommands.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&subcommands, &mut _s);
}
}
{
use ::quote::__private::ext::*;
let mut _first = true;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut child_subcommands, i) = child_subcommands.quote_into_iter();
let has_iter = has_iter | i;
<_ as ::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let child_subcommands =
match child_subcommands.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
if !_first { ::quote::__private::push_ident(&mut _s, "else"); }
_first = false;
::quote::ToTokens::to_tokens(&child_subcommands, &mut _s);
}
}
::quote::__private::push_ident(&mut _s, "false");
_s
}quote! {
419 #( #subcommands )*
420
421 #( #child_subcommands )else*
422
423 false
424 }
425 };
426 Ok(genned)
427}
428
429fn gen_from_arg_matches(variants: &[(&Variant, Item)]) -> Result<TokenStream, syn::Error> {
430 use syn::Fields::{Named, Unit, Unnamed};
431
432 let subcommand_name_var = ::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("__clap_name"))
}), ::quote::__private::Option::None)format_ident!("__clap_name");
433 let sub_arg_matches_var = ::quote::__private::mk_ident(&::alloc::__export::must_use({
::alloc::fmt::format(format_args!("__clap_arg_matches"))
}), ::quote::__private::Option::None)format_ident!("__clap_arg_matches");
434
435 let mut ext_subcmd = None;
436 let mut flatten_variants = Vec::new();
437 let mut unflatten_variants = Vec::new();
438 for (variant, item) in variants {
439 let kind = item.kind();
440 match &*kind {
441 Kind::Skip(_, _) | Kind::Arg(_) | Kind::FromGlobal(_) | Kind::Value => {}
442
443 Kind::ExternalSubcommand => {
444 if ext_subcmd.is_some() {
445 {
return Err({
#[allow(unused_imports)]
use crate::utils::error::*;
let msg =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("`#[command(external_subcommand)] can only be specified once and has already been specified"))
});
item.kind().span().EXPECTED_Span_OR_ToTokens(msg)
});
};abort!(
446 item.kind().span(),
447 "`#[command(external_subcommand)] can only be specified once and has already been specified"
448 );
449 }
450
451 let ty = match variant.fields {
452 Unnamed(ref fields) if fields.unnamed.len() == 1 => &fields.unnamed[0].ty,
453
454 _ => {
return Err({
#[allow(unused_imports)]
use crate::utils::error::*;
let msg =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid type for `#[command(external_subcommand)]`, expected a newtype variant with either a `Vec<String>` or `Vec<OsString>`"))
});
variant.EXPECTED_Span_OR_ToTokens(msg)
});
}abort!(
455 variant,
456 "invalid type for `#[command(external_subcommand)]`, expected a newtype variant with either a `Vec<String>` or `Vec<OsString>`"
457 ),
458 };
459
460 let (span, str_ty) = match subty_if_name(ty, "Vec") {
461 Some(subty) => {
462 if is_simple_ty(subty, "String") {
463 (subty.span(), {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "std");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "string");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "String");
_s
}quote!(::std::string::String))
464 } else if is_simple_ty(subty, "OsString") {
465 (subty.span(), {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "std");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ffi");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "OsString");
_s
}quote!(::std::ffi::OsString))
466 } else {
467 {
return Err({
#[allow(unused_imports)]
use crate::utils::error::*;
let msg =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid type for `#[command(external_subcommand)]`, expected a `Vec<String>` or `Vec<OsString>`"))
});
ty.span().EXPECTED_Span_OR_ToTokens(msg)
});
};abort!(
468 ty.span(),
469 "invalid type for `#[command(external_subcommand)]`, expected a `Vec<String>` or `Vec<OsString>`"
470 );
471 }
472 }
473
474 None => {
return Err({
#[allow(unused_imports)]
use crate::utils::error::*;
let msg =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid type for `#[command(external_subcommand)]`, expected a `Vec<String>` or `Vec<OsString>`"))
});
ty.span().EXPECTED_Span_OR_ToTokens(msg)
});
}abort!(
475 ty.span(),
476 "invalid type for `#[command(external_subcommand)]`, expected a `Vec<String>` or `Vec<OsString>`"
477 ),
478 };
479
480 ext_subcmd = Some((span, &variant.ident, str_ty));
481 }
482 Kind::Flatten(_) | Kind::Subcommand(_) | Kind::Command(_) => {
483 if #[allow(non_exhaustive_omitted_patterns)] match &*item.kind() {
Kind::Flatten(_) => true,
_ => false,
}matches!(&*item.kind(), Kind::Flatten(_)) {
484 flatten_variants.push((variant, item));
485 } else {
486 unflatten_variants.push((variant, item));
487 }
488 }
489 }
490 }
491
492 let subcommands = unflatten_variants.iter().map(|(variant, item)| {
493 let sub_name = item.cased_name();
494 let variant_name = &variant.ident;
495 let constructor_block = match variant.fields {
496 Named(ref fields) => {
497 let fields = collect_args_fields(item, fields)?;
498 args::gen_constructor(&fields)?
499 },
500 Unit => ::quote::__private::TokenStream::new()quote!(),
501 Unnamed(ref fields) if fields.unnamed.len() == 1 => {
502 let ty = &fields.unnamed[0].ty;
503 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::__private::push_ident(&mut _s, "as");
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "FromArgMatches");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "from_arg_matches_mut");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__clap_arg_matches");
_s
});
::quote::__private::push_question(&mut _s);
_s
});
_s
}quote!( ( <#ty as clap::FromArgMatches>::from_arg_matches_mut(__clap_arg_matches)? ) )
504 }
505 Unnamed(..) => {
let span = proc_macro2::Span::call_site();
{
return Err({
#[allow(unused_imports)]
use crate::utils::error::*;
let msg =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}: tuple enums are not supported",
variant.ident))
});
span.EXPECTED_Span_OR_ToTokens(msg)
});
}
}abort_call_site!("{}: tuple enums are not supported", variant.ident),
506 };
507
508 Ok({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "if");
::quote::ToTokens::to_tokens(&subcommand_name_var, &mut _s);
::quote::__private::push_eq_eq(&mut _s);
::quote::ToTokens::to_tokens(&sub_name, &mut _s);
::quote::__private::push_and_and(&mut _s);
::quote::__private::push_bang(&mut _s);
::quote::ToTokens::to_tokens(&sub_arg_matches_var, &mut _s);
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "contains_id");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::parse(&mut _s, "\"\"");
_s
});
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "return");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "std");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Ok");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "Self");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&variant_name, &mut _s);
::quote::ToTokens::to_tokens(&constructor_block, &mut _s);
_s
});
_s
});
_s
}quote! {
509 if #subcommand_name_var == #sub_name && !#sub_arg_matches_var.contains_id("") {
510 return ::std::result::Result::Ok(Self :: #variant_name #constructor_block)
511 }
512 })
513 }).collect::<Result<Vec<_>, syn::Error>>()?;
514 let child_subcommands = flatten_variants.iter().map(|(variant, _attrs)| {
515 let variant_name = &variant.ident;
516 match variant.fields {
517 Unnamed(ref fields) if fields.unnamed.len() == 1 => {
518 let ty = &fields.unnamed[0].ty;
519 Ok({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "if");
::quote::__private::push_ident(&mut _s, "__clap_arg_matches");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "subcommand_name");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "map");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_or(&mut _s);
::quote::__private::push_ident(&mut _s, "__clap_name");
::quote::__private::push_or(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::__private::push_ident(&mut _s, "as");
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Subcommand");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "has_subcommand");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__clap_name");
_s
});
_s
});
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "unwrap_or_default");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s, "__clap_res");
::quote::__private::push_eq(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::__private::push_ident(&mut _s, "as");
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "FromArgMatches");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "from_arg_matches_mut");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__clap_arg_matches");
_s
});
::quote::__private::push_question(&mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "return");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "std");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Ok");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "Self");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&variant_name, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__clap_res");
_s
});
_s
});
::quote::__private::push_semi(&mut _s);
_s
});
_s
}quote! {
520 if __clap_arg_matches
521 .subcommand_name()
522 .map(|__clap_name| <#ty as clap::Subcommand>::has_subcommand(__clap_name))
523 .unwrap_or_default()
524 {
525 let __clap_res = <#ty as clap::FromArgMatches>::from_arg_matches_mut(__clap_arg_matches)?;
526 return ::std::result::Result::Ok(Self :: #variant_name (__clap_res));
527 }
528 })
529 }
530 _ => {
return Err({
#[allow(unused_imports)]
use crate::utils::error::*;
let msg =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid variant for `#[command(flatten)]`, expected newtype variant"))
});
variant.EXPECTED_Span_OR_ToTokens(msg)
});
}abort!(
531 variant,
532 "invalid variant for `#[command(flatten)]`, expected newtype variant"
533 ),
534 }
535 }).collect::<Result<Vec<_>, syn::Error>>()?;
536
537 let wildcard = match ext_subcmd {
538 Some((span, var_name, str_ty)) => {
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(span).__into_span();
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "std");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "result");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "Result");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span, "Ok");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(_span).__into_span();
::quote::__private::push_ident_spanned(&mut _s, _span, "Self");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&var_name, &mut _s);
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(_span).__into_span();
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"std");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"iter");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"once");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(_span).__into_span();
::quote::ToTokens::to_tokens(&str_ty, &mut _s);
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"from");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
let _: ::quote::__private::Span =
::quote::__private::get_span(_span).__into_span();
::quote::ToTokens::to_tokens(&subcommand_name_var, &mut _s);
_s
});
_s
});
::quote::__private::push_dot_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"chain");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(_span).__into_span();
::quote::ToTokens::to_tokens(&sub_arg_matches_var, &mut _s);
::quote::__private::push_dot_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"remove_many");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_lt_spanned(&mut _s, _span);
::quote::ToTokens::to_tokens(&str_ty, &mut _s);
::quote::__private::push_gt_spanned(&mut _s, _span);
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(_span).__into_span();
::quote::__private::parse_spanned(&mut _s, _span, "\"\"");
_s
});
::quote::__private::push_dot_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"unwrap");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{
let _: ::quote::__private::Span =
::quote::__private::get_span(_span).__into_span();
::quote::__private::TokenStream::new()
});
::quote::__private::push_dot_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"map");
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
let _span: ::quote::__private::Span =
::quote::__private::get_span(_span).__into_span();
::quote::ToTokens::to_tokens(&str_ty, &mut _s);
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"from");
_s
});
_s
});
::quote::__private::push_dot_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"collect");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_lt_spanned(&mut _s, _span);
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"std");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"vec");
::quote::__private::push_colon2_spanned(&mut _s, _span);
::quote::__private::push_ident_spanned(&mut _s, _span,
"Vec");
::quote::__private::push_lt_spanned(&mut _s, _span);
::quote::__private::push_underscore_spanned(&mut _s, _span);
::quote::__private::push_shr_spanned(&mut _s, _span);
::quote::__private::push_group_spanned(&mut _s, _span,
::quote::__private::Delimiter::Parenthesis,
{
let _: ::quote::__private::Span =
::quote::__private::get_span(_span).__into_span();
::quote::__private::TokenStream::new()
});
_s
});
_s
});
_s
}quote_spanned! { span=>
539 ::std::result::Result::Ok(Self::#var_name(
540 ::std::iter::once(#str_ty::from(#subcommand_name_var))
541 .chain(
542 #sub_arg_matches_var
543 .remove_many::<#str_ty>("")
544 .unwrap()
545 .map(#str_ty::from)
546 )
547 .collect::<::std::vec::Vec<_>>()
548 ))
549 },
550
551 None => {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "std");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Err");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Error");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "raw");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "error");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ErrorKind");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"InvalidSubcommand");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "format");
::quote::__private::push_bang(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::parse(&mut _s,
"\"the subcommand \'{}\' wasn\'t recognized\"");
::quote::__private::push_comma(&mut _s);
::quote::ToTokens::to_tokens(&subcommand_name_var, &mut _s);
_s
});
_s
});
_s
});
_s
}quote! {
552 ::std::result::Result::Err(clap::Error::raw(clap::error::ErrorKind::InvalidSubcommand, format!("the subcommand '{}' wasn't recognized", #subcommand_name_var)))
553 },
554 };
555
556 let raw_deprecated = args::raw_deprecated();
557 Ok({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "from_arg_matches_mut");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__clap_arg_matches");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ArgMatches");
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "std");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "Self");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Error");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&raw_deprecated, &mut _s);
{
use ::quote::__private::ext::*;
let mut _first = true;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut child_subcommands, i) =
child_subcommands.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let child_subcommands =
match child_subcommands.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
if !_first {
::quote::__private::push_ident(&mut _s, "else");
}
_first = false;
::quote::ToTokens::to_tokens(&child_subcommands, &mut _s);
}
}
::quote::__private::push_ident(&mut _s, "if");
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&subcommand_name_var, &mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s,
"__clap_arg_sub_matches");
_s
});
_s
});
::quote::__private::push_eq(&mut _s);
::quote::__private::push_ident(&mut _s, "__clap_arg_matches");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "remove_subcommand");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::ToTokens::to_tokens(&sub_arg_matches_var, &mut _s);
::quote::__private::push_eq(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s,
"__clap_arg_sub_matches");
::quote::__private::push_semi(&mut _s);
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut subcommands, i) = subcommands.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let subcommands =
match subcommands.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&subcommands, &mut _s);
}
}
::quote::ToTokens::to_tokens(&wildcard, &mut _s);
_s
});
::quote::__private::push_ident(&mut _s, "else");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "std");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Err");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Error");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "raw");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "error");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ErrorKind");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"MissingSubcommand");
::quote::__private::push_comma(&mut _s);
::quote::__private::parse(&mut _s,
"\"a subcommand is required but one was not provided\"");
_s
});
_s
});
_s
});
_s
});
_s
}quote! {
558 fn from_arg_matches_mut(__clap_arg_matches: &mut clap::ArgMatches) -> ::std::result::Result<Self, clap::Error> {
559 #raw_deprecated
560
561 #( #child_subcommands )else*
562
563 if let Some((#subcommand_name_var, mut __clap_arg_sub_matches)) = __clap_arg_matches.remove_subcommand() {
564 let #sub_arg_matches_var = &mut __clap_arg_sub_matches;
565 #( #subcommands )*
566
567 #wildcard
568 } else {
569 ::std::result::Result::Err(clap::Error::raw(clap::error::ErrorKind::MissingSubcommand, "a subcommand is required but one was not provided"))
570 }
571 }
572 })
573}
574
575fn gen_update_from_arg_matches(variants: &[(&Variant, Item)]) -> Result<TokenStream, syn::Error> {
576 use syn::Fields::{Named, Unit, Unnamed};
577
578 let (flatten, variants): (Vec<_>, Vec<_>) = variants
579 .iter()
580 .filter_map(|(variant, item)| {
581 let kind = item.kind();
582 match &*kind {
583 Kind::Skip(_, _)
585 | Kind::Arg(_)
586 | Kind::FromGlobal(_)
587 | Kind::Value
588 | Kind::ExternalSubcommand => None,
589 Kind::Flatten(_) | Kind::Subcommand(_) | Kind::Command(_) => Some((variant, item)),
590 }
591 })
592 .partition(|(_, item)| {
593 let kind = item.kind();
594 #[allow(non_exhaustive_omitted_patterns)] match &*kind {
Kind::Flatten(_) => true,
_ => false,
}matches!(&*kind, Kind::Flatten(_))
595 });
596
597 let subcommands = variants.iter().map(|(variant, item)| {
598 let sub_name = item.cased_name();
599 let variant_name = &variant.ident;
600 let (pattern, updater) = match variant.fields {
601 Named(ref fields) => {
602 let field_names = fields.named.iter().map(|field| {
603 field.ident.as_ref().unwrap()
604 }).collect::<Vec<_>>();
605 let fields = collect_args_fields(item, fields)?;
606 let update = args::gen_updater(&fields, false)?;
607 ({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut field_names, i) = field_names.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let field_names =
match field_names.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&field_names, &mut _s);
::quote::__private::push_comma(&mut _s);
}
}
_s
});
_s
}quote!( { #( #field_names, )* }), {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&update, &mut _s);
_s
});
_s
}quote!( { #update } ))
608 }
609 Unit => (::quote::__private::TokenStream::new()quote!(), {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
::quote::__private::TokenStream::new());
_s
}quote!({})),
610 Unnamed(ref fields) => {
611 if fields.unnamed.len() == 1 {
612 (
613 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__clap_arg");
_s
});
_s
}quote!((__clap_arg)),
614 {
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "FromArgMatches");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "update_from_arg_matches_mut");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__clap_arg");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "__clap_arg_matches");
_s
});
::quote::__private::push_question(&mut _s);
_s
}quote!(clap::FromArgMatches::update_from_arg_matches_mut(
615 __clap_arg,
616 __clap_arg_matches
617 )?),
618 )
619 } else {
620 {
let span = proc_macro2::Span::call_site();
{
return Err({
#[allow(unused_imports)]
use crate::utils::error::*;
let msg =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("{0}: tuple enums are not supported",
variant.ident))
});
span.EXPECTED_Span_OR_ToTokens(msg)
});
}
}abort_call_site!("{}: tuple enums are not supported", variant.ident)
621 }
622 }
623 };
624
625 Ok({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "Self");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&variant_name, &mut _s);
::quote::ToTokens::to_tokens(&pattern, &mut _s);
::quote::__private::push_ident(&mut _s, "if");
::quote::ToTokens::to_tokens(&sub_name, &mut _s);
::quote::__private::push_eq_eq(&mut _s);
::quote::__private::push_ident(&mut _s, "__clap_name");
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_underscore(&mut _s);
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s,
"__clap_arg_sub_matches");
_s
});
::quote::__private::push_eq(&mut _s);
::quote::__private::push_ident(&mut _s, "__clap_arg_matches");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "remove_subcommand");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "unwrap");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s, "__clap_arg_matches");
::quote::__private::push_eq(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "__clap_arg_sub_matches");
::quote::__private::push_semi(&mut _s);
::quote::ToTokens::to_tokens(&updater, &mut _s);
_s
});
_s
}quote! {
626 Self :: #variant_name #pattern if #sub_name == __clap_name => {
627 let (_, mut __clap_arg_sub_matches) = __clap_arg_matches.remove_subcommand().unwrap();
628 let __clap_arg_matches = &mut __clap_arg_sub_matches;
629 #updater
630 }
631 })
632 }).collect::<Result<Vec<_>, _>>()?;
633
634 let child_subcommands = flatten.iter().map(|(variant, _attrs)| {
635 let variant_name = &variant.ident;
636 match variant.fields {
637 Unnamed(ref fields) if fields.unnamed.len() == 1 => {
638 let ty = &fields.unnamed[0].ty;
639 Ok({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "if");
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::__private::push_ident(&mut _s, "as");
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Subcommand");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "has_subcommand");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__clap_name");
_s
});
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "if");
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s, "Self");
::quote::__private::push_colon2(&mut _s);
::quote::ToTokens::to_tokens(&variant_name, &mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "child");
_s
});
::quote::__private::push_eq(&mut _s);
::quote::__private::push_ident(&mut _s, "s");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_lt(&mut _s);
::quote::ToTokens::to_tokens(&ty, &mut _s);
::quote::__private::push_ident(&mut _s, "as");
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "FromArgMatches");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"update_from_arg_matches_mut");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "child");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s,
"__clap_arg_matches");
_s
});
::quote::__private::push_question(&mut _s);
::quote::__private::push_semi(&mut _s);
::quote::__private::push_ident(&mut _s, "return");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "std");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Ok");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
});
::quote::__private::push_semi(&mut _s);
_s
});
_s
});
_s
}quote! {
640 if <#ty as clap::Subcommand>::has_subcommand(__clap_name) {
641 if let Self :: #variant_name (child) = s {
642 <#ty as clap::FromArgMatches>::update_from_arg_matches_mut(child, __clap_arg_matches)?;
643 return ::std::result::Result::Ok(());
644 }
645 }
646 })
647 }
648 _ => {
return Err({
#[allow(unused_imports)]
use crate::utils::error::*;
let msg =
::alloc::__export::must_use({
::alloc::fmt::format(format_args!("invalid variant for `#[command(flatten)]`, expected newtype variant"))
});
variant.EXPECTED_Span_OR_ToTokens(msg)
});
}abort!(
649 variant,
650 "invalid variant for `#[command(flatten)]`, expected newtype variant"
651 ),
652 }
653 }).collect::<Result<Vec<_>, _>>()?;
654
655 let raw_deprecated = args::raw_deprecated();
656 Ok({
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "fn");
::quote::__private::push_ident(&mut _s, "update_from_arg_matches_mut");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_lifetime(&mut _s, "\'b");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "__clap_arg_matches");
::quote::__private::push_colon(&mut _s);
::quote::__private::push_and(&mut _s);
::quote::__private::push_ident(&mut _s, "mut");
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "ArgMatches");
::quote::__private::push_comma(&mut _s);
_s
});
::quote::__private::push_rarrow(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "std");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_lt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_comma(&mut _s);
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Error");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::ToTokens::to_tokens(&raw_deprecated, &mut _s);
::quote::__private::push_ident(&mut _s, "if");
::quote::__private::push_ident(&mut _s, "let");
::quote::__private::push_ident(&mut _s, "Some");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "__clap_name");
_s
});
::quote::__private::push_eq(&mut _s);
::quote::__private::push_ident(&mut _s, "__clap_arg_matches");
::quote::__private::push_dot(&mut _s);
::quote::__private::push_ident(&mut _s, "subcommand_name");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s, "match");
::quote::__private::push_ident(&mut _s, "self");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let mut _first = true;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut subcommands, i) = subcommands.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let subcommands =
match subcommands.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
if !_first { ::quote::__private::push_comma(&mut _s); }
_first = false;
::quote::ToTokens::to_tokens(&subcommands, &mut _s);
}
}
::quote::__private::push_ident(&mut _s, "s");
::quote::__private::push_fat_arrow(&mut _s);
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Brace,
{
let mut _s = ::quote::__private::TokenStream::new();
{
use ::quote::__private::ext::*;
let has_iter = ::quote::__private::HasIterator::<false>;
#[allow(unused_mut)]
let (mut child_subcommands, i) =
child_subcommands.quote_into_iter();
let has_iter = has_iter | i;
<_ as
::quote::__private::CheckHasIterator<true>>::check(has_iter);
while true {
let child_subcommands =
match child_subcommands.next() {
Some(_x) => ::quote::__private::RepInterp(_x),
None => break,
};
::quote::ToTokens::to_tokens(&child_subcommands, &mut _s);
}
}
::quote::__private::push_star(&mut _s);
::quote::__private::push_ident(&mut _s, "s");
::quote::__private::push_eq(&mut _s);
::quote::__private::push_lt(&mut _s);
::quote::__private::push_ident(&mut _s, "Self");
::quote::__private::push_ident(&mut _s, "as");
::quote::__private::push_ident(&mut _s, "clap");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "FromArgMatches");
::quote::__private::push_gt(&mut _s);
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s,
"from_arg_matches_mut");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_ident(&mut _s,
"__clap_arg_matches");
_s
});
::quote::__private::push_question(&mut _s);
::quote::__private::push_semi(&mut _s);
_s
});
_s
});
_s
});
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "std");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Result");
::quote::__private::push_colon2(&mut _s);
::quote::__private::push_ident(&mut _s, "Ok");
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
{
let mut _s = ::quote::__private::TokenStream::new();
::quote::__private::push_group(&mut _s,
::quote::__private::Delimiter::Parenthesis,
::quote::__private::TokenStream::new());
_s
});
_s
});
_s
}quote! {
657 fn update_from_arg_matches_mut<'b>(
658 &mut self,
659 __clap_arg_matches: &mut clap::ArgMatches,
660 ) -> ::std::result::Result<(), clap::Error> {
661 #raw_deprecated
662
663 if let Some(__clap_name) = __clap_arg_matches.subcommand_name() {
664 match self {
665 #( #subcommands ),*
666 s => {
667 #( #child_subcommands )*
668 *s = <Self as clap::FromArgMatches>::from_arg_matches_mut(__clap_arg_matches)?;
669 }
670 }
671 }
672 ::std::result::Result::Ok(())
673 }
674 })
675}