aboutsummaryrefslogtreecommitdiff
path: root/vendor/clap_derive/src/derives
diff options
context:
space:
mode:
authorValentin Popov <valentin@popov.link>2024-07-19 15:37:58 +0300
committerValentin Popov <valentin@popov.link>2024-07-19 15:37:58 +0300
commita990de90fe41456a23e58bd087d2f107d321f3a1 (patch)
tree15afc392522a9e85dc3332235e311b7d39352ea9 /vendor/clap_derive/src/derives
parent3d48cd3f81164bbfc1a755dc1d4a9a02f98c8ddd (diff)
downloadfparkan-a990de90fe41456a23e58bd087d2f107d321f3a1.tar.xz
fparkan-a990de90fe41456a23e58bd087d2f107d321f3a1.zip
Deleted vendor folder
Diffstat (limited to 'vendor/clap_derive/src/derives')
-rw-r--r--vendor/clap_derive/src/derives/args.rs765
-rw-r--r--vendor/clap_derive/src/derives/into_app.rs117
-rw-r--r--vendor/clap_derive/src/derives/mod.rs23
-rw-r--r--vendor/clap_derive/src/derives/parser.rs119
-rw-r--r--vendor/clap_derive/src/derives/subcommand.rs674
-rw-r--r--vendor/clap_derive/src/derives/value_enum.rs130
6 files changed, 0 insertions, 1828 deletions
diff --git a/vendor/clap_derive/src/derives/args.rs b/vendor/clap_derive/src/derives/args.rs
deleted file mode 100644
index 279f6ca..0000000
--- a/vendor/clap_derive/src/derives/args.rs
+++ /dev/null
@@ -1,765 +0,0 @@
-// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,
-// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and
-// Ana Hobden (@hoverbear) <operator@hoverbear.org>
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-//
-// This work was derived from Structopt (https://github.com/TeXitoi/structopt)
-// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the
-// MIT/Apache 2.0 license.
-
-use proc_macro2::{Ident, Span, TokenStream};
-use quote::{format_ident, quote, quote_spanned};
-use syn::{
- punctuated::Punctuated, spanned::Spanned, token::Comma, Data, DataStruct, DeriveInput, Field,
- Fields, FieldsNamed, Generics,
-};
-
-use crate::item::{Item, Kind, Name};
-use crate::utils::{inner_type, sub_type, Sp, Ty};
-
-pub fn derive_args(input: &DeriveInput) -> Result<TokenStream, syn::Error> {
- let ident = &input.ident;
-
- match input.data {
- Data::Struct(DataStruct {
- fields: Fields::Named(ref fields),
- ..
- }) => {
- let name = Name::Derived(ident.clone());
- let item = Item::from_args_struct(input, name)?;
- let fields = collect_args_fields(&item, fields)?;
- gen_for_struct(&item, ident, &input.generics, &fields)
- }
- Data::Struct(DataStruct {
- fields: Fields::Unit,
- ..
- }) => {
- let name = Name::Derived(ident.clone());
- let item = Item::from_args_struct(input, name)?;
- let fields = Punctuated::<Field, Comma>::new();
- let fields = fields
- .iter()
- .map(|field| {
- let item = Item::from_args_field(field, item.casing(), item.env_casing())?;
- Ok((field, item))
- })
- .collect::<Result<Vec<_>, syn::Error>>()?;
- gen_for_struct(&item, ident, &input.generics, &fields)
- }
- _ => abort_call_site!("`#[derive(Args)]` only supports non-tuple structs"),
- }
-}
-
-pub fn gen_for_struct(
- item: &Item,
- item_name: &Ident,
- generics: &Generics,
- fields: &[(&Field, Item)],
-) -> Result<TokenStream, syn::Error> {
- if !matches!(&*item.kind(), Kind::Command(_)) {
- abort! { item.kind().span(),
- "`{}` cannot be used with `command`",
- item.kind().name(),
- }
- }
-
- let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
-
- let constructor = gen_constructor(fields)?;
- let updater = gen_updater(fields, true)?;
- let raw_deprecated = raw_deprecated();
-
- let app_var = Ident::new("__clap_app", Span::call_site());
- let augmentation = gen_augment(fields, &app_var, item, false)?;
- let augmentation_update = gen_augment(fields, &app_var, item, true)?;
-
- let group_id = if item.skip_group() {
- quote!(None)
- } else {
- let group_id = item.group_id();
- quote!(Some(clap::Id::from(#group_id)))
- };
-
- Ok(quote! {
- #[allow(
- dead_code,
- unreachable_code,
- unused_variables,
- unused_braces,
- unused_qualifications,
- )]
- #[allow(
- clippy::style,
- clippy::complexity,
- clippy::pedantic,
- clippy::restriction,
- clippy::perf,
- clippy::deprecated,
- clippy::nursery,
- clippy::cargo,
- clippy::suspicious_else_formatting,
- clippy::almost_swapped,
- clippy::redundant_locals,
- )]
- #[automatically_derived]
- impl #impl_generics clap::FromArgMatches for #item_name #ty_generics #where_clause {
- fn from_arg_matches(__clap_arg_matches: &clap::ArgMatches) -> ::std::result::Result<Self, clap::Error> {
- Self::from_arg_matches_mut(&mut __clap_arg_matches.clone())
- }
-
- fn from_arg_matches_mut(__clap_arg_matches: &mut clap::ArgMatches) -> ::std::result::Result<Self, clap::Error> {
- #raw_deprecated
- let v = #item_name #constructor;
- ::std::result::Result::Ok(v)
- }
-
- fn update_from_arg_matches(&mut self, __clap_arg_matches: &clap::ArgMatches) -> ::std::result::Result<(), clap::Error> {
- self.update_from_arg_matches_mut(&mut __clap_arg_matches.clone())
- }
-
- fn update_from_arg_matches_mut(&mut self, __clap_arg_matches: &mut clap::ArgMatches) -> ::std::result::Result<(), clap::Error> {
- #raw_deprecated
- #updater
- ::std::result::Result::Ok(())
- }
- }
-
- #[allow(
- dead_code,
- unreachable_code,
- unused_variables,
- unused_braces,
- unused_qualifications,
- )]
- #[allow(
- clippy::style,
- clippy::complexity,
- clippy::pedantic,
- clippy::restriction,
- clippy::perf,
- clippy::deprecated,
- clippy::nursery,
- clippy::cargo,
- clippy::suspicious_else_formatting,
- clippy::almost_swapped,
- clippy::redundant_locals,
- )]
- #[automatically_derived]
- impl #impl_generics clap::Args for #item_name #ty_generics #where_clause {
- fn group_id() -> Option<clap::Id> {
- #group_id
- }
- fn augment_args<'b>(#app_var: clap::Command) -> clap::Command {
- #augmentation
- }
- fn augment_args_for_update<'b>(#app_var: clap::Command) -> clap::Command {
- #augmentation_update
- }
- }
- })
-}
-
-/// Generate a block of code to add arguments/subcommands corresponding to
-/// the `fields` to an cmd.
-pub fn gen_augment(
- fields: &[(&Field, Item)],
- app_var: &Ident,
- parent_item: &Item,
- override_required: bool,
-) -> Result<TokenStream, syn::Error> {
- let mut subcommand_specified = false;
- let mut args = Vec::new();
- for (field, item) in fields {
- let kind = item.kind();
- let genned = match &*kind {
- Kind::Command(_)
- | Kind::Value
- | Kind::Skip(_, _)
- | Kind::FromGlobal(_)
- | Kind::ExternalSubcommand => None,
- Kind::Subcommand(ty) => {
- if subcommand_specified {
- abort!(
- field.span(),
- "`#[command(subcommand)]` can only be used once per container"
- );
- }
- subcommand_specified = true;
-
- let subcmd_type = match (**ty, sub_type(&field.ty)) {
- (Ty::Option, Some(sub_type)) => sub_type,
- _ => &field.ty,
- };
- let implicit_methods = if **ty == Ty::Option {
- quote!()
- } else {
- quote_spanned! { kind.span()=>
- .subcommand_required(true)
- .arg_required_else_help(true)
- }
- };
-
- let override_methods = if override_required {
- quote_spanned! { kind.span()=>
- .subcommand_required(false)
- .arg_required_else_help(false)
- }
- } else {
- quote!()
- };
-
- Some(quote! {
- let #app_var = <#subcmd_type as clap::Subcommand>::augment_subcommands( #app_var );
- let #app_var = #app_var
- #implicit_methods
- #override_methods;
- })
- }
- Kind::Flatten(ty) => {
- let inner_type = match (**ty, sub_type(&field.ty)) {
- (Ty::Option, Some(sub_type)) => sub_type,
- _ => &field.ty,
- };
-
- let next_help_heading = item.next_help_heading();
- let next_display_order = item.next_display_order();
- if override_required {
- Some(quote_spanned! { kind.span()=>
- let #app_var = #app_var
- #next_help_heading
- #next_display_order;
- let #app_var = <#inner_type as clap::Args>::augment_args_for_update(#app_var);
- })
- } else {
- Some(quote_spanned! { kind.span()=>
- let #app_var = #app_var
- #next_help_heading
- #next_display_order;
- let #app_var = <#inner_type as clap::Args>::augment_args(#app_var);
- })
- }
- }
- Kind::Arg(ty) => {
- let value_parser = item.value_parser(&field.ty);
- let action = item.action(&field.ty);
- let value_name = item.value_name();
-
- let implicit_methods = match **ty {
- Ty::Unit => {
- // Leaving out `value_parser` as it will always fail
- quote_spanned! { ty.span()=>
- .value_name(#value_name)
- #action
- }
- }
- Ty::Option => {
- quote_spanned! { ty.span()=>
- .value_name(#value_name)
- #value_parser
- #action
- }
- }
-
- Ty::OptionOption => quote_spanned! { ty.span()=>
- .value_name(#value_name)
- .num_args(0..=1)
- #value_parser
- #action
- },
-
- Ty::OptionVec => {
- if item.is_positional() {
- quote_spanned! { ty.span()=>
- .value_name(#value_name)
- .num_args(1..) // action won't be sufficient for getting multiple
- #value_parser
- #action
- }
- } else {
- quote_spanned! { ty.span()=>
- .value_name(#value_name)
- #value_parser
- #action
- }
- }
- }
-
- Ty::Vec => {
- if item.is_positional() {
- quote_spanned! { ty.span()=>
- .value_name(#value_name)
- .num_args(1..) // action won't be sufficient for getting multiple
- #value_parser
- #action
- }
- } else {
- quote_spanned! { ty.span()=>
- .value_name(#value_name)
- #value_parser
- #action
- }
- }
- }
-
- Ty::VecVec | Ty::OptionVecVec => {
- quote_spanned! { ty.span() =>
- .value_name(#value_name)
- #value_parser
- #action
- }
- }
-
- Ty::Other => {
- let required = item.find_default_method().is_none();
- // `ArgAction::takes_values` is assuming `ArgAction::default_value` will be
- // set though that won't always be true but this should be good enough,
- // otherwise we'll report an "arg required" error when unwrapping.
- let action_value = action.args();
- quote_spanned! { ty.span()=>
- .value_name(#value_name)
- .required(#required && #action_value.takes_values())
- #value_parser
- #action
- }
- }
- };
-
- let id = item.id();
- let explicit_methods = item.field_methods();
- let deprecations = if !override_required {
- item.deprecations()
- } else {
- quote!()
- };
- let override_methods = if override_required {
- quote_spanned! { kind.span()=>
- .required(false)
- }
- } else {
- quote!()
- };
-
- Some(quote_spanned! { field.span()=>
- let #app_var = #app_var.arg({
- #deprecations
-
- #[allow(deprecated)]
- let arg = clap::Arg::new(#id)
- #implicit_methods;
-
- let arg = arg
- #explicit_methods;
-
- let arg = arg
- #override_methods;
-
- arg
- });
- })
- }
- };
- args.push(genned);
- }
-
- let deprecations = if !override_required {
- parent_item.deprecations()
- } else {
- quote!()
- };
- let initial_app_methods = parent_item.initial_top_level_methods();
- let final_app_methods = parent_item.final_top_level_methods();
- let group_app_methods = if parent_item.skip_group() {
- quote!()
- } else {
- let group_id = parent_item.group_id();
- let literal_group_members = fields
- .iter()
- .filter_map(|(_field, item)| {
- let kind = item.kind();
- if matches!(*kind, Kind::Arg(_)) {
- Some(item.id())
- } else {
- None
- }
- })
- .collect::<Vec<_>>();
- let literal_group_members_len = literal_group_members.len();
- let mut literal_group_members = quote! {{
- let members: [clap::Id; #literal_group_members_len] = [#( clap::Id::from(#literal_group_members) ),* ];
- members
- }};
- // HACK: Validation isn't ready yet for nested arg groups, so just don't populate the group in
- // that situation
- let possible_group_members_len = fields
- .iter()
- .filter(|(_field, item)| {
- let kind = item.kind();
- matches!(*kind, Kind::Flatten(_))
- })
- .count();
- if 0 < possible_group_members_len {
- literal_group_members = quote! {{
- let members: [clap::Id; 0] = [];
- members
- }};
- }
-
- let group_methods = parent_item.group_methods();
-
- quote!(
- .group(
- clap::ArgGroup::new(#group_id)
- .multiple(true)
- #group_methods
- .args(#literal_group_members)
- )
- )
- };
- Ok(quote! {{
- #deprecations
- let #app_var = #app_var
- #initial_app_methods
- #group_app_methods
- ;
- #( #args )*
- #app_var #final_app_methods
- }})
-}
-
-pub fn gen_constructor(fields: &[(&Field, Item)]) -> Result<TokenStream, syn::Error> {
- let fields = fields.iter().map(|(field, item)| {
- let field_name = field.ident.as_ref().unwrap();
- let kind = item.kind();
- let arg_matches = format_ident!("__clap_arg_matches");
- let genned = match &*kind {
- Kind::Command(_)
- | Kind::Value
- | Kind::ExternalSubcommand => {
- abort! { kind.span(),
- "`{}` cannot be used with `arg`",
- kind.name(),
- }
- }
- Kind::Subcommand(ty) => {
- let subcmd_type = match (**ty, sub_type(&field.ty)) {
- (Ty::Option, Some(sub_type)) => sub_type,
- _ => &field.ty,
- };
- match **ty {
- Ty::Option => {
- quote_spanned! { kind.span()=>
- #field_name: {
- if #arg_matches.subcommand_name().map(<#subcmd_type as clap::Subcommand>::has_subcommand).unwrap_or(false) {
- Some(<#subcmd_type as clap::FromArgMatches>::from_arg_matches_mut(#arg_matches)?)
- } else {
- None
- }
- }
- }
- },
- Ty::Other => {
- quote_spanned! { kind.span()=>
- #field_name: {
- <#subcmd_type as clap::FromArgMatches>::from_arg_matches_mut(#arg_matches)?
- }
- }
- },
- Ty::Unit |
- Ty::Vec |
- Ty::OptionOption |
- Ty::OptionVec |
- Ty::VecVec |
- Ty::OptionVecVec => {
- abort!(
- ty.span(),
- "{} types are not supported for subcommand",
- ty.as_str()
- );
- }
- }
- }
-
- Kind::Flatten(ty) => {
- let inner_type = match (**ty, sub_type(&field.ty)) {
- (Ty::Option, Some(sub_type)) => sub_type,
- _ => &field.ty,
- };
- match **ty {
- Ty::Other => {
- quote_spanned! { kind.span()=>
- #field_name: <#inner_type as clap::FromArgMatches>::from_arg_matches_mut(#arg_matches)?
- }
- },
- Ty::Option => {
- quote_spanned! { kind.span()=>
- #field_name: {
- let group_id = <#inner_type as clap::Args>::group_id()
- .expect("`#[arg(flatten)]`ed field type implements `Args::group_id`");
- if #arg_matches.contains_id(group_id.as_str()) {
- Some(
- <#inner_type as clap::FromArgMatches>::from_arg_matches_mut(#arg_matches)?
- )
- } else {
- None
- }
- }
- }
- },
- Ty::Unit |
- Ty::Vec |
- Ty::OptionOption |
- Ty::OptionVec |
- Ty::VecVec |
- Ty::OptionVecVec => {
- abort!(
- ty.span(),
- "{} types are not supported for flatten",
- ty.as_str()
- );
- }
- }
- },
-
- Kind::Skip(val, _) => match val {
- None => quote_spanned!(kind.span()=> #field_name: Default::default()),
- Some(val) => quote_spanned!(kind.span()=> #field_name: (#val).into()),
- },
-
- Kind::Arg(ty) | Kind::FromGlobal(ty) => {
- gen_parsers(item, ty, field_name, field, None)?
- }
- };
- Ok(genned)
- }).collect::<Result<Vec<_>, syn::Error>>()?;
-
- Ok(quote! {{
- #( #fields ),*
- }})
-}
-
-pub fn gen_updater(fields: &[(&Field, Item)], use_self: bool) -> Result<TokenStream, syn::Error> {
- let mut genned_fields = Vec::new();
- for (field, item) in fields {
- let field_name = field.ident.as_ref().unwrap();
- let kind = item.kind();
-
- let access = if use_self {
- quote! {
- #[allow(non_snake_case)]
- let #field_name = &mut self.#field_name;
- }
- } else {
- quote!()
- };
- let arg_matches = format_ident!("__clap_arg_matches");
-
- let genned = match &*kind {
- Kind::Command(_) | Kind::Value | Kind::ExternalSubcommand => {
- abort! { kind.span(),
- "`{}` cannot be used with `arg`",
- kind.name(),
- }
- }
- Kind::Subcommand(ty) => {
- let subcmd_type = match (**ty, sub_type(&field.ty)) {
- (Ty::Option, Some(sub_type)) => sub_type,
- _ => &field.ty,
- };
-
- let updater = quote_spanned! { ty.span()=>
- <#subcmd_type as clap::FromArgMatches>::update_from_arg_matches_mut(#field_name, #arg_matches)?;
- };
-
- let updater = match **ty {
- Ty::Option => quote_spanned! { kind.span()=>
- if let Some(#field_name) = #field_name.as_mut() {
- #updater
- } else {
- *#field_name = Some(<#subcmd_type as clap::FromArgMatches>::from_arg_matches_mut(
- #arg_matches
- )?);
- }
- },
- _ => quote_spanned! { kind.span()=>
- #updater
- },
- };
-
- quote_spanned! { kind.span()=>
- {
- #access
- #updater
- }
- }
- }
-
- Kind::Flatten(ty) => {
- let inner_type = match (**ty, sub_type(&field.ty)) {
- (Ty::Option, Some(sub_type)) => sub_type,
- _ => &field.ty,
- };
-
- let updater = quote_spanned! { ty.span()=>
- <#inner_type as clap::FromArgMatches>::update_from_arg_matches_mut(#field_name, #arg_matches)?;
- };
-
- let updater = match **ty {
- Ty::Option => quote_spanned! { kind.span()=>
- if let Some(#field_name) = #field_name.as_mut() {
- #updater
- } else {
- *#field_name = Some(<#inner_type as clap::FromArgMatches>::from_arg_matches_mut(
- #arg_matches
- )?);
- }
- },
- _ => quote_spanned! { kind.span()=>
- #updater
- },
- };
-
- quote_spanned! { kind.span()=>
- {
- #access
- #updater
- }
- }
- }
-
- Kind::Skip(_, _) => quote!(),
-
- Kind::Arg(ty) | Kind::FromGlobal(ty) => {
- gen_parsers(item, ty, field_name, field, Some(&access))?
- }
- };
- genned_fields.push(genned);
- }
-
- Ok(quote! {
- #( #genned_fields )*
- })
-}
-
-fn gen_parsers(
- item: &Item,
- ty: &Sp<Ty>,
- field_name: &Ident,
- field: &Field,
- update: Option<&TokenStream>,
-) -> Result<TokenStream, syn::Error> {
- let span = ty.span();
- let convert_type = inner_type(&field.ty);
- let id = item.id();
- let get_one = quote_spanned!(span=> remove_one::<#convert_type>);
- let get_many = quote_spanned!(span=> remove_many::<#convert_type>);
- let get_occurrences = quote_spanned!(span=> remove_occurrences::<#convert_type>);
-
- // Give this identifier the same hygiene
- // as the `arg_matches` parameter definition. This
- // allows us to refer to `arg_matches` within a `quote_spanned` block
- let arg_matches = format_ident!("__clap_arg_matches");
-
- let field_value = match **ty {
- Ty::Unit => {
- quote_spanned! { ty.span()=>
- ()
- }
- }
-
- Ty::Option => {
- quote_spanned! { ty.span()=>
- #arg_matches.#get_one(#id)
- }
- }
-
- Ty::OptionOption => quote_spanned! { ty.span()=>
- if #arg_matches.contains_id(#id) {
- Some(
- #arg_matches.#get_one(#id)
- )
- } else {
- None
- }
- },
-
- Ty::OptionVec => quote_spanned! { ty.span()=>
- if #arg_matches.contains_id(#id) {
- Some(#arg_matches.#get_many(#id)
- .map(|v| v.collect::<Vec<_>>())
- .unwrap_or_else(Vec::new))
- } else {
- None
- }
- },
-
- Ty::Vec => {
- quote_spanned! { ty.span()=>
- #arg_matches.#get_many(#id)
- .map(|v| v.collect::<Vec<_>>())
- .unwrap_or_else(Vec::new)
- }
- }
-
- Ty::VecVec => quote_spanned! { ty.span()=>
- #arg_matches.#get_occurrences(#id)
- .map(|g| g.map(::std::iter::Iterator::collect).collect::<Vec<Vec<_>>>())
- .unwrap_or_else(Vec::new)
- },
-
- Ty::OptionVecVec => quote_spanned! { ty.span()=>
- #arg_matches.#get_occurrences(#id)
- .map(|g| g.map(::std::iter::Iterator::collect).collect::<Vec<Vec<_>>>())
- },
-
- Ty::Other => {
- quote_spanned! { ty.span()=>
- #arg_matches.#get_one(#id)
- .ok_or_else(|| clap::Error::raw(clap::error::ErrorKind::MissingRequiredArgument, concat!("The following required argument was not provided: ", #id)))?
- }
- }
- };
-
- let genned = if let Some(access) = update {
- quote_spanned! { field.span()=>
- if #arg_matches.contains_id(#id) {
- #access
- *#field_name = #field_value
- }
- }
- } else {
- quote_spanned!(field.span()=> #field_name: #field_value )
- };
- Ok(genned)
-}
-
-#[cfg(feature = "raw-deprecated")]
-pub fn raw_deprecated() -> TokenStream {
- quote! {}
-}
-
-#[cfg(not(feature = "raw-deprecated"))]
-pub fn raw_deprecated() -> TokenStream {
- quote! {
- #![allow(deprecated)] // Assuming any deprecation in here will be related to a deprecation in `Args`
-
- }
-}
-
-pub fn collect_args_fields<'a>(
- item: &'a Item,
- fields: &'a FieldsNamed,
-) -> Result<Vec<(&'a Field, Item)>, syn::Error> {
- fields
- .named
- .iter()
- .map(|field| {
- let item = Item::from_args_field(field, item.casing(), item.env_casing())?;
- Ok((field, item))
- })
- .collect()
-}
diff --git a/vendor/clap_derive/src/derives/into_app.rs b/vendor/clap_derive/src/derives/into_app.rs
deleted file mode 100644
index 5abf4ea..0000000
--- a/vendor/clap_derive/src/derives/into_app.rs
+++ /dev/null
@@ -1,117 +0,0 @@
-// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,
-// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and
-// Ana Hobden (@hoverbear) <operator@hoverbear.org>
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-//
-// This work was derived from Structopt (https://github.com/TeXitoi/structopt)
-// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the
-// MIT/Apache 2.0 license.
-
-use proc_macro2::{Span, TokenStream};
-use quote::quote;
-use syn::{Generics, Ident};
-
-use crate::item::Item;
-
-pub fn gen_for_struct(
- item: &Item,
- item_name: &Ident,
- generics: &Generics,
-) -> Result<TokenStream, syn::Error> {
- let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
-
- let name = item.cased_name();
- let app_var = Ident::new("__clap_app", Span::call_site());
-
- let tokens = quote! {
- #[allow(
- dead_code,
- unreachable_code,
- unused_variables,
- unused_braces,
- unused_qualifications,
- )]
- #[allow(
- clippy::style,
- clippy::complexity,
- clippy::pedantic,
- clippy::restriction,
- clippy::perf,
- clippy::deprecated,
- clippy::nursery,
- clippy::cargo,
- clippy::suspicious_else_formatting,
- clippy::almost_swapped,
- clippy::redundant_locals,
- )]
- #[automatically_derived]
- impl #impl_generics clap::CommandFactory for #item_name #ty_generics #where_clause {
- fn command<'b>() -> clap::Command {
- let #app_var = clap::Command::new(#name);
- <Self as clap::Args>::augment_args(#app_var)
- }
-
- fn command_for_update<'b>() -> clap::Command {
- let #app_var = clap::Command::new(#name);
- <Self as clap::Args>::augment_args_for_update(#app_var)
- }
- }
- };
-
- Ok(tokens)
-}
-
-pub fn gen_for_enum(
- item: &Item,
- item_name: &Ident,
- generics: &Generics,
-) -> Result<TokenStream, syn::Error> {
- let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
-
- let name = item.cased_name();
- let app_var = Ident::new("__clap_app", Span::call_site());
-
- Ok(quote! {
- #[allow(
- dead_code,
- unreachable_code,
- unused_variables,
- unused_braces,
- unused_qualifications,
- )]
- #[allow(
- clippy::style,
- clippy::complexity,
- clippy::pedantic,
- clippy::restriction,
- clippy::perf,
- clippy::deprecated,
- clippy::nursery,
- clippy::cargo,
- clippy::suspicious_else_formatting,
- clippy::almost_swapped,
- clippy::redundant_locals,
- )]
- #[automatically_derived]
- impl #impl_generics clap::CommandFactory for #item_name #ty_generics #where_clause {
- fn command<'b>() -> clap::Command {
- let #app_var = clap::Command::new(#name)
- .subcommand_required(true)
- .arg_required_else_help(true);
- <Self as clap::Subcommand>::augment_subcommands(#app_var)
- }
-
- fn command_for_update<'b>() -> clap::Command {
- let #app_var = clap::Command::new(#name);
- <Self as clap::Subcommand>::augment_subcommands_for_update(#app_var)
- .subcommand_required(false)
- .arg_required_else_help(false)
- }
- }
- })
-}
diff --git a/vendor/clap_derive/src/derives/mod.rs b/vendor/clap_derive/src/derives/mod.rs
deleted file mode 100644
index 3deeb91..0000000
--- a/vendor/clap_derive/src/derives/mod.rs
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,
-// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and
-// Ana Hobden (@hoverbear) <operator@hoverbear.org>
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-//
-// This work was derived from Structopt (https://github.com/TeXitoi/structopt)
-// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the
-// MIT/Apache 2.0 license.
-mod args;
-mod into_app;
-mod parser;
-mod subcommand;
-mod value_enum;
-
-pub use self::parser::derive_parser;
-pub use args::derive_args;
-pub use subcommand::derive_subcommand;
-pub use value_enum::derive_value_enum;
diff --git a/vendor/clap_derive/src/derives/parser.rs b/vendor/clap_derive/src/derives/parser.rs
deleted file mode 100644
index e511bda..0000000
--- a/vendor/clap_derive/src/derives/parser.rs
+++ /dev/null
@@ -1,119 +0,0 @@
-// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,
-// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and
-// Ana Hobden (@hoverbear) <operator@hoverbear.org>
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-//
-// This work was derived from Structopt (https://github.com/TeXitoi/structopt)
-// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the
-// MIT/Apache 2.0 license.
-
-use proc_macro2::TokenStream;
-use quote::quote;
-use syn::Ident;
-use syn::Variant;
-use syn::{
- self, punctuated::Punctuated, token::Comma, Data, DataStruct, DeriveInput, Field, Fields,
- Generics,
-};
-
-use crate::derives::args::collect_args_fields;
-use crate::derives::{args, into_app, subcommand};
-use crate::item::Item;
-use crate::item::Name;
-
-pub fn derive_parser(input: &DeriveInput) -> Result<TokenStream, syn::Error> {
- let ident = &input.ident;
- let pkg_name = std::env::var("CARGO_PKG_NAME").ok().unwrap_or_default();
-
- match input.data {
- Data::Struct(DataStruct {
- fields: Fields::Named(ref fields),
- ..
- }) => {
- let name = Name::Assigned(quote!(#pkg_name));
- let item = Item::from_args_struct(input, name)?;
- let fields = collect_args_fields(&item, fields)?;
- gen_for_struct(&item, ident, &input.generics, &fields)
- }
- Data::Struct(DataStruct {
- fields: Fields::Unit,
- ..
- }) => {
- let name = Name::Assigned(quote!(#pkg_name));
- let item = Item::from_args_struct(input, name)?;
- let fields = Punctuated::<Field, Comma>::new();
- let fields = fields
- .iter()
- .map(|field| {
- let item = Item::from_args_field(field, item.casing(), item.env_casing())?;
- Ok((field, item))
- })
- .collect::<Result<Vec<_>, syn::Error>>()?;
- gen_for_struct(&item, ident, &input.generics, &fields)
- }
- Data::Enum(ref e) => {
- let name = Name::Assigned(quote!(#pkg_name));
- let item = Item::from_subcommand_enum(input, name)?;
- let variants = e
- .variants
- .iter()
- .map(|variant| {
- let item =
- Item::from_subcommand_variant(variant, item.casing(), item.env_casing())?;
- Ok((variant, item))
- })
- .collect::<Result<Vec<_>, syn::Error>>()?;
- gen_for_enum(&item, ident, &input.generics, &variants)
- }
- _ => abort_call_site!("`#[derive(Parser)]` only supports non-tuple structs and enums"),
- }
-}
-
-fn gen_for_struct(
- item: &Item,
- item_name: &Ident,
- generics: &Generics,
- fields: &[(&Field, Item)],
-) -> Result<TokenStream, syn::Error> {
- let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
-
- let into_app = into_app::gen_for_struct(item, item_name, generics)?;
- let args = args::gen_for_struct(item, item_name, generics, fields)?;
-
- Ok(quote! {
- #[automatically_derived]
- #[allow(
- unused_qualifications,
- clippy::redundant_locals,
- )]
- impl #impl_generics clap::Parser for #item_name #ty_generics #where_clause {}
-
- #into_app
- #args
- })
-}
-
-fn gen_for_enum(
- item: &Item,
- item_name: &Ident,
- generics: &Generics,
- variants: &[(&Variant, Item)],
-) -> Result<TokenStream, syn::Error> {
- let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
-
- let into_app = into_app::gen_for_enum(item, item_name, generics)?;
- let subcommand = subcommand::gen_for_enum(item, item_name, generics, variants)?;
-
- Ok(quote! {
- #[automatically_derived]
- impl #impl_generics clap::Parser for #item_name #ty_generics #where_clause {}
-
- #into_app
- #subcommand
- })
-}
diff --git a/vendor/clap_derive/src/derives/subcommand.rs b/vendor/clap_derive/src/derives/subcommand.rs
deleted file mode 100644
index da438d3..0000000
--- a/vendor/clap_derive/src/derives/subcommand.rs
+++ /dev/null
@@ -1,674 +0,0 @@
-// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,
-// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and
-// Ana Hobden (@hoverbear) <operator@hoverbear.org>
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-//
-// This work was derived from Structopt (https://github.com/TeXitoi/structopt)
-// commit#ea76fa1b1b273e65e3b0b1046643715b49bec51f which is licensed under the
-// MIT/Apache 2.0 license.
-
-use proc_macro2::{Ident, Span, TokenStream};
-use quote::{format_ident, quote, quote_spanned};
-use syn::{spanned::Spanned, Data, DeriveInput, FieldsUnnamed, Generics, Variant};
-
-use crate::derives::args;
-use crate::derives::args::collect_args_fields;
-use crate::item::{Item, Kind, Name};
-use crate::utils::{is_simple_ty, subty_if_name};
-
-pub fn derive_subcommand(input: &DeriveInput) -> Result<TokenStream, syn::Error> {
- let ident = &input.ident;
-
- match input.data {
- Data::Enum(ref e) => {
- let name = Name::Derived(ident.clone());
- let item = Item::from_subcommand_enum(input, name)?;
- let variants = e
- .variants
- .iter()
- .map(|variant| {
- let item =
- Item::from_subcommand_variant(variant, item.casing(), item.env_casing())?;
- Ok((variant, item))
- })
- .collect::<Result<Vec<_>, syn::Error>>()?;
- gen_for_enum(&item, ident, &input.generics, &variants)
- }
- _ => abort_call_site!("`#[derive(Subcommand)]` only supports enums"),
- }
-}
-
-pub fn gen_for_enum(
- item: &Item,
- item_name: &Ident,
- generics: &Generics,
- variants: &[(&Variant, Item)],
-) -> Result<TokenStream, syn::Error> {
- if !matches!(&*item.kind(), Kind::Command(_)) {
- abort! { item.kind().span(),
- "`{}` cannot be used with `command`",
- item.kind().name(),
- }
- }
-
- let (impl_generics, ty_generics, where_clause) = generics.split_for_impl();
-
- let from_arg_matches = gen_from_arg_matches(variants)?;
- let update_from_arg_matches = gen_update_from_arg_matches(variants)?;
-
- let augmentation = gen_augment(variants, item, false)?;
- let augmentation_update = gen_augment(variants, item, true)?;
- let has_subcommand = gen_has_subcommand(variants)?;
-
- Ok(quote! {
- #[allow(
- dead_code,
- unreachable_code,
- unused_variables,
- unused_braces,
- unused_qualifications,
- )]
- #[allow(
- clippy::style,
- clippy::complexity,
- clippy::pedantic,
- clippy::restriction,
- clippy::perf,
- clippy::deprecated,
- clippy::nursery,
- clippy::cargo,
- clippy::suspicious_else_formatting,
- clippy::almost_swapped,
- clippy::redundant_locals,
- )]
- #[automatically_derived]
- impl #impl_generics clap::FromArgMatches for #item_name #ty_generics #where_clause {
- fn from_arg_matches(__clap_arg_matches: &clap::ArgMatches) -> ::std::result::Result<Self, clap::Error> {
- Self::from_arg_matches_mut(&mut __clap_arg_matches.clone())
- }
-
- #from_arg_matches
-
- fn update_from_arg_matches(&mut self, __clap_arg_matches: &clap::ArgMatches) -> ::std::result::Result<(), clap::Error> {
- self.update_from_arg_matches_mut(&mut __clap_arg_matches.clone())
- }
- #update_from_arg_matches
- }
-
- #[allow(
- dead_code,
- unreachable_code,
- unused_variables,
- unused_braces,
- unused_qualifications,
- )]
- #[allow(
- clippy::style,
- clippy::complexity,
- clippy::pedantic,
- clippy::restriction,
- clippy::perf,
- clippy::deprecated,
- clippy::nursery,
- clippy::cargo,
- clippy::suspicious_else_formatting,
- clippy::almost_swapped,
- clippy::redundant_locals,
- )]
- #[automatically_derived]
- impl #impl_generics clap::Subcommand for #item_name #ty_generics #where_clause {
- fn augment_subcommands <'b>(__clap_app: clap::Command) -> clap::Command {
- #augmentation
- }
- fn augment_subcommands_for_update <'b>(__clap_app: clap::Command) -> clap::Command {
- #augmentation_update
- }
- fn has_subcommand(__clap_name: &str) -> bool {
- #has_subcommand
- }
- }
- })
-}
-
-fn gen_augment(
- variants: &[(&Variant, Item)],
- parent_item: &Item,
- override_required: bool,
-) -> Result<TokenStream, syn::Error> {
- use syn::Fields::*;
-
- let app_var = Ident::new("__clap_app", Span::call_site());
-
- let mut subcommands = Vec::new();
- for (variant, item) in variants {
- let kind = item.kind();
-
- let genned = match &*kind {
- Kind::Skip(_, _) | Kind::Arg(_) | Kind::FromGlobal(_) | Kind::Value => None,
-
- Kind::ExternalSubcommand => {
- let ty = match variant.fields {
- Unnamed(ref fields) if fields.unnamed.len() == 1 => &fields.unnamed[0].ty,
-
- _ => abort!(
- variant,
- "The enum variant marked with `external_subcommand` must be \
- a single-typed tuple, and the type must be either `Vec<String>` \
- or `Vec<OsString>`."
- ),
- };
- let deprecations = if !override_required {
- item.deprecations()
- } else {
- quote!()
- };
- let subty = subty_if_name(ty, "Vec").ok_or_else(|| {
- format_err!(
- ty.span(),
- "The type must be `Vec<_>` \
- to be used with `external_subcommand`."
- )
- })?;
- let subcommand = quote_spanned! { kind.span()=>
- #deprecations
- let #app_var = #app_var
- .external_subcommand_value_parser(clap::value_parser!(#subty));
- };
- Some(subcommand)
- }
-
- Kind::Flatten(_) => match variant.fields {
- Unnamed(FieldsUnnamed { ref unnamed, .. }) if unnamed.len() == 1 => {
- let ty = &unnamed[0].ty;
- let deprecations = if !override_required {
- item.deprecations()
- } else {
- quote!()
- };
- let next_help_heading = item.next_help_heading();
- let next_display_order = item.next_display_order();
- let subcommand = if override_required {
- quote! {
- #deprecations
- let #app_var = #app_var
- #next_help_heading
- #next_display_order;
- let #app_var = <#ty as clap::Subcommand>::augment_subcommands_for_update(#app_var);
- }
- } else {
- quote! {
- #deprecations
- let #app_var = #app_var
- #next_help_heading
- #next_display_order;
- let #app_var = <#ty as clap::Subcommand>::augment_subcommands(#app_var);
- }
- };
- Some(subcommand)
- }
- _ => abort!(
- variant,
- "`flatten` is usable only with single-typed tuple variants"
- ),
- },
-
- Kind::Subcommand(_) => {
- let subcommand_var = Ident::new("__clap_subcommand", Span::call_site());
- let arg_block = match variant.fields {
- Named(_) => {
- abort!(variant, "non single-typed tuple enums are not supported")
- }
- Unit => quote!( #subcommand_var ),
- Unnamed(FieldsUnnamed { ref unnamed, .. }) if unnamed.len() == 1 => {
- let ty = &unnamed[0].ty;
- if override_required {
- quote_spanned! { ty.span()=>
- {
- <#ty as clap::Subcommand>::augment_subcommands_for_update(#subcommand_var)
- }
- }
- } else {
- quote_spanned! { ty.span()=>
- {
- <#ty as clap::Subcommand>::augment_subcommands(#subcommand_var)
- }
- }
- }
- }
- Unnamed(..) => {
- abort!(variant, "non single-typed tuple enums are not supported")
- }
- };
-
- let name = item.cased_name();
- let deprecations = if !override_required {
- item.deprecations()
- } else {
- quote!()
- };
- let initial_app_methods = item.initial_top_level_methods();
- let final_from_attrs = item.final_top_level_methods();
- let override_methods = if override_required {
- quote_spanned! { kind.span()=>
- .subcommand_required(false)
- .arg_required_else_help(false)
- }
- } else {
- quote!()
- };
- let subcommand = quote! {
- let #app_var = #app_var.subcommand({
- #deprecations;
- let #subcommand_var = clap::Command::new(#name);
- let #subcommand_var = #subcommand_var
- .subcommand_required(true)
- .arg_required_else_help(true);
- let #subcommand_var = #subcommand_var #initial_app_methods;
- let #subcommand_var = #arg_block;
- #subcommand_var #final_from_attrs #override_methods
- });
- };
- Some(subcommand)
- }
-
- Kind::Command(_) => {
- let subcommand_var = Ident::new("__clap_subcommand", Span::call_site());
- let sub_augment = match variant.fields {
- Named(ref fields) => {
- // Defer to `gen_augment` for adding cmd methods
- let fields = collect_args_fields(item, fields)?;
- args::gen_augment(&fields, &subcommand_var, item, override_required)?
- }
- Unit => {
- let arg_block = quote!( #subcommand_var );
- let initial_app_methods = item.initial_top_level_methods();
- let final_from_attrs = item.final_top_level_methods();
- quote! {
- let #subcommand_var = #subcommand_var #initial_app_methods;
- let #subcommand_var = #arg_block;
- #subcommand_var #final_from_attrs
- }
- }
- Unnamed(FieldsUnnamed { ref unnamed, .. }) if unnamed.len() == 1 => {
- let ty = &unnamed[0].ty;
- let arg_block = if override_required {
- quote_spanned! { ty.span()=>
- {
- <#ty as clap::Args>::augment_args_for_update(#subcommand_var)
- }
- }
- } else {
- quote_spanned! { ty.span()=>
- {
- <#ty as clap::Args>::augment_args(#subcommand_var)
- }
- }
- };
- let initial_app_methods = item.initial_top_level_methods();
- let final_from_attrs = item.final_top_level_methods();
- quote! {
- let #subcommand_var = #subcommand_var #initial_app_methods;
- let #subcommand_var = #arg_block;
- #subcommand_var #final_from_attrs
- }
- }
- Unnamed(..) => {
- abort!(variant, "non single-typed tuple enums are not supported")
- }
- };
-
- let deprecations = if !override_required {
- item.deprecations()
- } else {
- quote!()
- };
- let name = item.cased_name();
- let subcommand = quote! {
- let #app_var = #app_var.subcommand({
- #deprecations
- let #subcommand_var = clap::Command::new(#name);
- #sub_augment
- });
- };
- Some(subcommand)
- }
- };
- subcommands.push(genned);
- }
-
- let deprecations = if !override_required {
- parent_item.deprecations()
- } else {
- quote!()
- };
- let initial_app_methods = parent_item.initial_top_level_methods();
- let final_app_methods = parent_item.final_top_level_methods();
- Ok(quote! {
- #deprecations;
- let #app_var = #app_var #initial_app_methods;
- #( #subcommands )*;
- #app_var #final_app_methods
- })
-}
-
-fn gen_has_subcommand(variants: &[(&Variant, Item)]) -> Result<TokenStream, syn::Error> {
- use syn::Fields::*;
-
- let mut ext_subcmd = false;
-
- let (flatten_variants, variants): (Vec<_>, Vec<_>) = variants
- .iter()
- .filter_map(|(variant, item)| {
- let kind = item.kind();
- match &*kind {
- Kind::Skip(_, _) | Kind::Arg(_) | Kind::FromGlobal(_) | Kind::Value => None,
-
- Kind::ExternalSubcommand => {
- ext_subcmd = true;
- None
- }
- Kind::Flatten(_) | Kind::Subcommand(_) | Kind::Command(_) => Some((variant, item)),
- }
- })
- .partition(|(_, item)| {
- let kind = item.kind();
- matches!(&*kind, Kind::Flatten(_))
- });
-
- let subcommands = variants.iter().map(|(_variant, item)| {
- let sub_name = item.cased_name();
- quote! {
- if #sub_name == __clap_name {
- return true
- }
- }
- });
- let child_subcommands = flatten_variants
- .iter()
- .map(|(variant, _attrs)| match variant.fields {
- Unnamed(ref fields) if fields.unnamed.len() == 1 => {
- let ty = &fields.unnamed[0].ty;
- Ok(quote! {
- if <#ty as clap::Subcommand>::has_subcommand(__clap_name) {
- return true;
- }
- })
- }
- _ => abort!(
- variant,
- "`flatten` is usable only with single-typed tuple variants"
- ),
- })
- .collect::<Result<Vec<_>, syn::Error>>()?;
-
- let genned = if ext_subcmd {
- quote! { true }
- } else {
- quote! {
- #( #subcommands )*
-
- #( #child_subcommands )else*
-
- false
- }
- };
- Ok(genned)
-}
-
-fn gen_from_arg_matches(variants: &[(&Variant, Item)]) -> Result<TokenStream, syn::Error> {
- use syn::Fields::*;
-
- let subcommand_name_var = format_ident!("__clap_name");
- let sub_arg_matches_var = format_ident!("__clap_arg_matches");
-
- let mut ext_subcmd = None;
- let mut flatten_variants = Vec::new();
- let mut unflatten_variants = Vec::new();
- for (variant, item) in variants {
- let kind = item.kind();
- match &*kind {
- Kind::Skip(_, _) | Kind::Arg(_) | Kind::FromGlobal(_) | Kind::Value => {}
-
- Kind::ExternalSubcommand => {
- if ext_subcmd.is_some() {
- abort!(
- item.kind().span(),
- "Only one variant can be marked with `external_subcommand`, \
- this is the second"
- );
- }
-
- let ty = match variant.fields {
- Unnamed(ref fields) if fields.unnamed.len() == 1 => &fields.unnamed[0].ty,
-
- _ => abort!(
- variant,
- "The enum variant marked with `external_subcommand` must be \
- a single-typed tuple, and the type must be either `Vec<String>` \
- or `Vec<OsString>`."
- ),
- };
-
- let (span, str_ty) = match subty_if_name(ty, "Vec") {
- Some(subty) => {
- if is_simple_ty(subty, "String") {
- (subty.span(), quote!(::std::string::String))
- } else if is_simple_ty(subty, "OsString") {
- (subty.span(), quote!(::std::ffi::OsString))
- } else {
- abort!(
- ty.span(),
- "The type must be either `Vec<String>` or `Vec<OsString>` \
- to be used with `external_subcommand`."
- );
- }
- }
-
- None => abort!(
- ty.span(),
- "The type must be either `Vec<String>` or `Vec<OsString>` \
- to be used with `external_subcommand`."
- ),
- };
-
- ext_subcmd = Some((span, &variant.ident, str_ty));
- }
- Kind::Flatten(_) | Kind::Subcommand(_) | Kind::Command(_) => {
- if matches!(&*item.kind(), Kind::Flatten(_)) {
- flatten_variants.push((variant, item));
- } else {
- unflatten_variants.push((variant, item));
- }
- }
- }
- }
-
- let subcommands = unflatten_variants.iter().map(|(variant, item)| {
- let sub_name = item.cased_name();
- let variant_name = &variant.ident;
- let constructor_block = match variant.fields {
- Named(ref fields) => {
- let fields = collect_args_fields(item, fields)?;
- args::gen_constructor(&fields)?
- },
- Unit => quote!(),
- Unnamed(ref fields) if fields.unnamed.len() == 1 => {
- let ty = &fields.unnamed[0].ty;
- quote!( ( <#ty as clap::FromArgMatches>::from_arg_matches_mut(__clap_arg_matches)? ) )
- }
- Unnamed(..) => abort_call_site!("{}: tuple enums are not supported", variant.ident),
- };
-
- Ok(quote! {
- if #subcommand_name_var == #sub_name && !#sub_arg_matches_var.contains_id("") {
- return ::std::result::Result::Ok(Self :: #variant_name #constructor_block)
- }
- })
- }).collect::<Result<Vec<_>, syn::Error>>()?;
- let child_subcommands = flatten_variants.iter().map(|(variant, _attrs)| {
- let variant_name = &variant.ident;
- match variant.fields {
- Unnamed(ref fields) if fields.unnamed.len() == 1 => {
- let ty = &fields.unnamed[0].ty;
- Ok(quote! {
- if __clap_arg_matches
- .subcommand_name()
- .map(|__clap_name| <#ty as clap::Subcommand>::has_subcommand(__clap_name))
- .unwrap_or_default()
- {
- let __clap_res = <#ty as clap::FromArgMatches>::from_arg_matches_mut(__clap_arg_matches)?;
- return ::std::result::Result::Ok(Self :: #variant_name (__clap_res));
- }
- })
- }
- _ => abort!(
- variant,
- "`flatten` is usable only with single-typed tuple variants"
- ),
- }
- }).collect::<Result<Vec<_>, syn::Error>>()?;
-
- let wildcard = match ext_subcmd {
- Some((span, var_name, str_ty)) => quote_spanned! { span=>
- ::std::result::Result::Ok(Self::#var_name(
- ::std::iter::once(#str_ty::from(#subcommand_name_var))
- .chain(
- #sub_arg_matches_var
- .remove_many::<#str_ty>("")
- .unwrap()
- .map(#str_ty::from)
- )
- .collect::<::std::vec::Vec<_>>()
- ))
- },
-
- None => quote! {
- ::std::result::Result::Err(clap::Error::raw(clap::error::ErrorKind::InvalidSubcommand, format!("The subcommand '{}' wasn't recognized", #subcommand_name_var)))
- },
- };
-
- let raw_deprecated = args::raw_deprecated();
- Ok(quote! {
- fn from_arg_matches_mut(__clap_arg_matches: &mut clap::ArgMatches) -> ::std::result::Result<Self, clap::Error> {
- #raw_deprecated
-
- #( #child_subcommands )else*
-
- if let Some((#subcommand_name_var, mut __clap_arg_sub_matches)) = __clap_arg_matches.remove_subcommand() {
- let #sub_arg_matches_var = &mut __clap_arg_sub_matches;
- #( #subcommands )*
-
- #wildcard
- } else {
- ::std::result::Result::Err(clap::Error::raw(clap::error::ErrorKind::MissingSubcommand, "A subcommand is required but one was not provided."))
- }
- }
- })
-}
-
-fn gen_update_from_arg_matches(variants: &[(&Variant, Item)]) -> Result<TokenStream, syn::Error> {
- use syn::Fields::*;
-
- let (flatten, variants): (Vec<_>, Vec<_>) = variants
- .iter()
- .filter_map(|(variant, item)| {
- let kind = item.kind();
- match &*kind {
- // Fallback to `from_arg_matches_mut`
- Kind::Skip(_, _)
- | Kind::Arg(_)
- | Kind::FromGlobal(_)
- | Kind::Value
- | Kind::ExternalSubcommand => None,
- Kind::Flatten(_) | Kind::Subcommand(_) | Kind::Command(_) => Some((variant, item)),
- }
- })
- .partition(|(_, item)| {
- let kind = item.kind();
- matches!(&*kind, Kind::Flatten(_))
- });
-
- let subcommands = variants.iter().map(|(variant, item)| {
- let sub_name = item.cased_name();
- let variant_name = &variant.ident;
- let (pattern, updater) = match variant.fields {
- Named(ref fields) => {
- let field_names = fields.named.iter().map(|field| {
- field.ident.as_ref().unwrap()
- }).collect::<Vec<_>>();
- let fields = collect_args_fields(item, fields)?;
- let update = args::gen_updater(&fields, false)?;
- (quote!( { #( #field_names, )* }), quote!( { #update } ))
- }
- Unit => (quote!(), quote!({})),
- Unnamed(ref fields) => {
- if fields.unnamed.len() == 1 {
- (
- quote!((ref mut __clap_arg)),
- quote!(clap::FromArgMatches::update_from_arg_matches_mut(
- __clap_arg,
- __clap_arg_matches
- )?),
- )
- } else {
- abort_call_site!("{}: tuple enums are not supported", variant.ident)
- }
- }
- };
-
- Ok(quote! {
- Self :: #variant_name #pattern if #sub_name == __clap_name => {
- let (_, mut __clap_arg_sub_matches) = __clap_arg_matches.remove_subcommand().unwrap();
- let __clap_arg_matches = &mut __clap_arg_sub_matches;
- #updater
- }
- })
- }).collect::<Result<Vec<_>, _>>()?;
-
- let child_subcommands = flatten.iter().map(|(variant, _attrs)| {
- let variant_name = &variant.ident;
- match variant.fields {
- Unnamed(ref fields) if fields.unnamed.len() == 1 => {
- let ty = &fields.unnamed[0].ty;
- Ok(quote! {
- if <#ty as clap::Subcommand>::has_subcommand(__clap_name) {
- if let Self :: #variant_name (child) = s {
- <#ty as clap::FromArgMatches>::update_from_arg_matches_mut(child, __clap_arg_matches)?;
- return ::std::result::Result::Ok(());
- }
- }
- })
- }
- _ => abort!(
- variant,
- "`flatten` is usable only with single-typed tuple variants"
- ),
- }
- }).collect::<Result<Vec<_>, _>>()?;
-
- let raw_deprecated = args::raw_deprecated();
- Ok(quote! {
- fn update_from_arg_matches_mut<'b>(
- &mut self,
- __clap_arg_matches: &mut clap::ArgMatches,
- ) -> ::std::result::Result<(), clap::Error> {
- #raw_deprecated
-
- if let Some(__clap_name) = __clap_arg_matches.subcommand_name() {
- match self {
- #( #subcommands ),*
- s => {
- #( #child_subcommands )*
- *s = <Self as clap::FromArgMatches>::from_arg_matches_mut(__clap_arg_matches)?;
- }
- }
- }
- ::std::result::Result::Ok(())
- }
- })
-}
diff --git a/vendor/clap_derive/src/derives/value_enum.rs b/vendor/clap_derive/src/derives/value_enum.rs
deleted file mode 100644
index c0e0434..0000000
--- a/vendor/clap_derive/src/derives/value_enum.rs
+++ /dev/null
@@ -1,130 +0,0 @@
-// Copyright 2018 Guillaume Pinot (@TeXitoi) <texitoi@texitoi.eu>,
-// Kevin Knapp (@kbknapp) <kbknapp@gmail.com>, and
-// Ana Hobden (@hoverbear) <operator@hoverbear.org>
-//
-// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
-// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
-// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
-// option. This file may not be copied, modified, or distributed
-// except according to those terms.
-
-use proc_macro2::TokenStream;
-use quote::quote;
-use quote::quote_spanned;
-use syn::{spanned::Spanned, Data, DeriveInput, Fields, Ident, Variant};
-
-use crate::item::{Item, Kind, Name};
-
-pub fn derive_value_enum(input: &DeriveInput) -> Result<TokenStream, syn::Error> {
- let ident = &input.ident;
-
- match input.data {
- Data::Enum(ref e) => {
- let name = Name::Derived(ident.clone());
- let item = Item::from_value_enum(input, name)?;
- let mut variants = Vec::new();
- for variant in &e.variants {
- let item =
- Item::from_value_enum_variant(variant, item.casing(), item.env_casing())?;
- variants.push((variant, item));
- }
- gen_for_enum(&item, ident, &variants)
- }
- _ => abort_call_site!("`#[derive(ValueEnum)]` only supports enums"),
- }
-}
-
-pub fn gen_for_enum(
- item: &Item,
- item_name: &Ident,
- variants: &[(&Variant, Item)],
-) -> Result<TokenStream, syn::Error> {
- if !matches!(&*item.kind(), Kind::Value) {
- abort! { item.kind().span(),
- "`{}` cannot be used with `value`",
- item.kind().name(),
- }
- }
-
- let lits = lits(variants)?;
- let value_variants = gen_value_variants(&lits);
- let to_possible_value = gen_to_possible_value(item, &lits);
-
- Ok(quote! {
- #[allow(
- dead_code,
- unreachable_code,
- unused_variables,
- unused_braces,
- unused_qualifications,
- )]
- #[allow(
- clippy::style,
- clippy::complexity,
- clippy::pedantic,
- clippy::restriction,
- clippy::perf,
- clippy::deprecated,
- clippy::nursery,
- clippy::cargo,
- clippy::suspicious_else_formatting,
- clippy::almost_swapped,
- clippy::redundant_locals,
- )]
- #[automatically_derived]
- impl clap::ValueEnum for #item_name {
- #value_variants
- #to_possible_value
- }
- })
-}
-
-fn lits(variants: &[(&Variant, Item)]) -> Result<Vec<(TokenStream, Ident)>, syn::Error> {
- let mut genned = Vec::new();
- for (variant, item) in variants {
- if let Kind::Skip(_, _) = &*item.kind() {
- continue;
- }
- if !matches!(variant.fields, Fields::Unit) {
- abort!(variant.span(), "`#[derive(ValueEnum)]` only supports unit variants. Non-unit variants must be skipped");
- }
- let fields = item.field_methods();
- let deprecations = item.deprecations();
- let name = item.cased_name();
- genned.push((
- quote_spanned! { variant.span()=> {
- #deprecations
- clap::builder::PossibleValue::new(#name)
- #fields
- }},
- variant.ident.clone(),
- ));
- }
- Ok(genned)
-}
-
-fn gen_value_variants(lits: &[(TokenStream, Ident)]) -> TokenStream {
- let lit = lits.iter().map(|l| &l.1).collect::<Vec<_>>();
-
- quote! {
- fn value_variants<'a>() -> &'a [Self]{
- &[#(Self::#lit),*]
- }
- }
-}
-
-fn gen_to_possible_value(item: &Item, lits: &[(TokenStream, Ident)]) -> TokenStream {
- let (lit, variant): (Vec<TokenStream>, Vec<Ident>) = lits.iter().cloned().unzip();
-
- let deprecations = item.deprecations();
-
- quote! {
- fn to_possible_value<'a>(&self) -> ::std::option::Option<clap::builder::PossibleValue> {
- #deprecations
- match self {
- #(Self::#variant => Some(#lit),)*
- _ => None
- }
- }
- }
-}