Skip to main content

clap_derive/derives/
subcommand.rs

1// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,
2// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and
3// Ana Hobden (@hoverbear) <operator@hoverbear.org>
4//
5// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
6// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
7// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
8// option. This file may not be copied, modified, or distributed
9// except according to those terms.
10//
11// This work was derived from Structopt (https://github.com/TeXitoi/structopt)
12// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the
13// MIT/Apache 2.0 license.
14
15use 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                        // Defer to `gen_augment` for adding cmd methods
287                        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                // Fallback to `from_arg_matches_mut`
584                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}