diff --git a/src/build/app/mod.rs b/src/build/app/mod.rs index 4d2d3eba..6fd4fda9 100644 --- a/src/build/app/mod.rs +++ b/src/build/app/mod.rs @@ -5,27 +5,29 @@ mod tests; pub use self::settings::AppSettings; // Std -use std::collections::HashMap; -use std::env; -use std::ffi::OsString; -use std::fmt; -use std::io::{self, BufRead, Write}; -use std::ops::Index; -use std::path::Path; -use std::process; +use std::{ + collections::HashMap, + env, + ffi::OsString, + fmt, + io::{self, BufRead, Write}, + ops::Index, + path::Path, +}; // Third Party #[cfg(feature = "yaml")] use yaml_rust::Yaml; // Internal -use crate::build::{app::settings::AppFlags, Arg, ArgGroup, ArgSettings}; -use crate::mkeymap::MKeyMap; -use crate::output::{fmt::Colorizer, Help, HelpWriter, Usage}; -use crate::parse::errors::Result as ClapResult; -use crate::parse::{ArgMatcher, ArgMatches, Input, Parser}; -use crate::util::{termcolor::ColorChoice, Id, Key}; -use crate::INTERNAL_ERROR_MSG; +use crate::{ + build::{app::settings::AppFlags, Arg, ArgGroup, ArgSettings}, + mkeymap::MKeyMap, + output::{fmt::Colorizer, Help, HelpWriter, Usage}, + parse::{ArgMatcher, ArgMatches, Input, Parser}, + util::{safe_exit, termcolor::ColorChoice, Id, Key}, + Result as ClapResult, INTERNAL_ERROR_MSG, +}; // FIXME (@CreepySkeleton): some of these variants are never constructed #[derive(Clone, Debug, PartialEq, Eq)] @@ -1299,7 +1301,7 @@ impl<'b> App<'b> { } drop(e); - process::exit(2); + safe_exit(2); } e.exit() @@ -1377,7 +1379,7 @@ impl<'b> App<'b> { drop(self); drop(e); - process::exit(2); + safe_exit(2); } drop(self); @@ -1912,7 +1914,7 @@ impl<'b> App<'b> { }; if let Some(bn) = self.bin_name.as_ref() { if bn.contains(' ') { - // Incase we're dealing with subcommands i.e. git mv is translated to git-mv + // In case we're dealing with subcommands i.e. git mv is translated to git-mv write!(w, "{} {}", bn.replace(" ", "-"), ver) } else { write!(w, "{} {}", &self.name[..], ver) diff --git a/src/build/app/settings.rs b/src/build/app/settings.rs index 7a0aa407..e66e2263 100644 --- a/src/build/app/settings.rs +++ b/src/build/app/settings.rs @@ -1,8 +1,8 @@ // Std +use std::{ops::BitOr, str::FromStr}; + +// Third party use bitflags::bitflags; -#[allow(unused_imports)] -use std::ops::BitOr; -use std::str::FromStr; bitflags! { struct Flags: u64 { diff --git a/src/build/arg/mod.rs b/src/build/arg/mod.rs index eb8448ce..7f8a2a8d 100644 --- a/src/build/arg/mod.rs +++ b/src/build/arg/mod.rs @@ -5,21 +5,25 @@ mod tests; pub use self::settings::ArgSettings; // Std -use std::borrow::Cow; -use std::cmp::{Ord, Ordering}; -use std::env; -use std::ffi::{OsStr, OsString}; -use std::fmt::{self, Display, Formatter}; -use std::rc::Rc; -use std::str; +use std::{ + borrow::Cow, + cmp::{Ord, Ordering}, + env, + ffi::{OsStr, OsString}, + fmt::{self, Display, Formatter}, + rc::Rc, + str, +}; // Third Party -use crate::util::VecMap; // Internal -use crate::build::{arg::settings::ArgFlags, usage_parser::UsageParser}; -use crate::util::{Id, Key}; -use crate::INTERNAL_ERROR_MSG; +use crate::{ + build::{arg::settings::ArgFlags, usage_parser::UsageParser}, + util::VecMap, + util::{Id, Key}, + INTERNAL_ERROR_MSG, +}; type Validator = Rc Result<(), String>>; type ValidatorOs = Rc Result<(), String>>; diff --git a/src/build/arg/settings.rs b/src/build/arg/settings.rs index 692fd0be..82e5c5c8 100644 --- a/src/build/arg/settings.rs +++ b/src/build/arg/settings.rs @@ -1,6 +1,7 @@ // Std use std::str::FromStr; +// Third party use bitflags::bitflags; bitflags! { diff --git a/src/build/arg_group.rs b/src/build/arg_group.rs index fe64b5a8..5201e970 100644 --- a/src/build/arg_group.rs +++ b/src/build/arg_group.rs @@ -1,5 +1,4 @@ // Std - use std::fmt::{Debug, Formatter, Result}; // Internal diff --git a/src/build/mod.rs b/src/build/mod.rs index ee6641d4..9ed76dac 100644 --- a/src/build/mod.rs +++ b/src/build/mod.rs @@ -7,6 +7,8 @@ pub mod arg; mod arg_group; mod usage_parser; -pub use self::app::{App, AppSettings}; -pub use self::arg::{Arg, ArgSettings}; -pub use self::arg_group::ArgGroup; +pub use self::{ + app::{App, AppSettings}, + arg::{Arg, ArgSettings}, + arg_group::ArgGroup, +}; diff --git a/src/build/usage_parser.rs b/src/build/usage_parser.rs index 391560ee..51c372c8 100644 --- a/src/build/usage_parser.rs +++ b/src/build/usage_parser.rs @@ -1,7 +1,9 @@ // Internal -use crate::build::{Arg, ArgSettings}; -use crate::util::VecMap; -use crate::INTERNAL_ERROR_MSG; +use crate::{ + build::{Arg, ArgSettings}, + util::VecMap, + INTERNAL_ERROR_MSG, +}; #[derive(PartialEq, Debug)] enum UsageToken { diff --git a/src/derive.rs b/src/derive.rs index cca2519d..c69c5a3b 100644 --- a/src/derive.rs +++ b/src/derive.rs @@ -1,6 +1,7 @@ //! This module contains traits that are usable with `#[derive(...)].` use crate::{App, ArgMatches, Error}; + use std::ffi::OsString; /// This trait is just a convenience on top of FromArgMatches + IntoApp diff --git a/src/lib.rs b/src/lib.rs index a2856188..8e4974ab 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -446,10 +446,12 @@ #[cfg(not(feature = "std"))] compile_error!("`std` feature is currently required to build `clap`"); -pub use crate::build::{App, AppSettings, Arg, ArgGroup, ArgSettings}; -pub use crate::derive::{ArgEnum, Clap, FromArgMatches, IntoApp, Subcommand}; -pub use crate::parse::errors::{Error, ErrorKind, Result}; -pub use crate::parse::{ArgMatches, OsValues, SubCommand, Values}; +pub use crate::{ + build::{App, AppSettings, Arg, ArgGroup, ArgSettings}, + derive::{ArgEnum, Clap, FromArgMatches, IntoApp, Subcommand}, + parse::errors::{Error, ErrorKind, Result}, + parse::{ArgMatches, OsValues, SubCommand, Values}, +}; #[cfg(feature = "yaml")] pub use yaml_rust::YamlLoader; diff --git a/src/mkeymap.rs b/src/mkeymap.rs index b55cb040..51d7d9c3 100644 --- a/src/mkeymap.rs +++ b/src/mkeymap.rs @@ -1,8 +1,9 @@ -use crate::build::Arg; -use crate::util::Id; -use crate::INTERNAL_ERROR_MSG; -use std::ffi::{OsStr, OsString}; -use std::ops::Index; +use crate::{build::Arg, util::Id, INTERNAL_ERROR_MSG}; + +use std::{ + ffi::{OsStr, OsString}, + ops::Index, +}; #[derive(PartialEq, Debug, Clone)] pub(crate) struct Key { diff --git a/src/output/fmt.rs b/src/output/fmt.rs index f4138f88..e8c09f63 100644 --- a/src/output/fmt.rs +++ b/src/output/fmt.rs @@ -2,8 +2,10 @@ use crate::util::termcolor::{Buffer, BufferWriter, ColorChoice}; #[cfg(feature = "color")] use crate::util::termcolor::{Color, ColorSpec, WriteColor}; -use std::fmt::{self, Debug, Formatter}; -use std::io::{Result, Write}; +use std::{ + fmt::{self, Debug, Formatter}, + io::{Result, Write}, +}; #[cfg(feature = "color")] fn is_a_tty(stderr: bool) -> bool { diff --git a/src/output/help.rs b/src/output/help.rs index d8089354..b511cfef 100644 --- a/src/output/help.rs +++ b/src/output/help.rs @@ -1,18 +1,23 @@ // Std -use std::borrow::Cow; -use std::cmp; -use std::collections::BTreeMap; -use std::io::{self, Cursor, Read, Write}; -use std::usize; +use std::{ + borrow::Cow, + cmp, + collections::BTreeMap, + io::{self, Cursor, Read, Write}, + usize, +}; // Internal -use crate::build::{App, AppSettings, Arg, ArgSettings}; -use crate::output::{fmt::Colorizer, Usage}; -use crate::parse::errors::{Error, Result as ClapResult}; -use crate::parse::Parser; -use crate::util::VecMap; -use crate::INTERNAL_ERROR_MSG; +use crate::{ + build::{App, AppSettings, Arg, ArgSettings}, + output::{fmt::Colorizer, Usage}, + parse::errors::{Error, Result as ClapResult}, + parse::Parser, + util::VecMap, + INTERNAL_ERROR_MSG, +}; +// Third party use unicode_width::UnicodeWidthStr; #[cfg(not(feature = "wrap_help"))] diff --git a/src/output/usage.rs b/src/output/usage.rs index 226f1de8..db6693bf 100644 --- a/src/output/usage.rs +++ b/src/output/usage.rs @@ -1,12 +1,14 @@ // std -use crate::util::Id; use std::collections::{BTreeMap, VecDeque}; // Internal -use crate::build::AppSettings as AS; -use crate::build::{Arg, ArgSettings}; -use crate::parse::{ArgMatcher, Parser}; -use crate::INTERNAL_ERROR_MSG; +use crate::{ + build::AppSettings as AS, + build::{Arg, ArgSettings}, + parse::{ArgMatcher, Parser}, + util::Id, + INTERNAL_ERROR_MSG, +}; pub(crate) struct Usage<'b, 'c, 'z> where diff --git a/src/parse/arg_matcher.rs b/src/parse/arg_matcher.rs index 3d310aee..9dda0a8d 100644 --- a/src/parse/arg_matcher.rs +++ b/src/parse/arg_matcher.rs @@ -1,13 +1,12 @@ // Std -use std::collections::HashMap; -use std::ffi::OsString; -use std::mem; -use std::ops::Deref; +use std::{collections::HashMap, ffi::OsString, mem, ops::Deref}; // Internal -use crate::build::{Arg, ArgSettings}; -use crate::parse::{ArgMatches, MatchedArg, SubCommand, ValueType}; -use crate::util::Id; +use crate::{ + build::{Arg, ArgSettings}, + parse::{ArgMatches, MatchedArg, SubCommand, ValueType}, + util::Id, +}; #[derive(Debug)] pub(crate) struct ArgMatcher(pub(crate) ArgMatches); diff --git a/src/parse/errors.rs b/src/parse/errors.rs index 738f96d6..2fde154f 100644 --- a/src/parse/errors.rs +++ b/src/parse/errors.rs @@ -1,16 +1,19 @@ // Std -use std::collections::VecDeque; -use std::convert::From; -use std::fmt::{self, Debug, Display, Formatter}; -use std::io; -use std::process; -use std::result::Result as StdResult; +use std::{ + collections::VecDeque, + convert::From, + fmt::{self, Debug, Display, Formatter}, + io, + result::Result as StdResult, +}; // Internal -use crate::build::{Arg, ArgGroup}; -use crate::output::fmt::Colorizer; -use crate::parse::features::suggestions; -use crate::util::termcolor::ColorChoice; +use crate::{ + build::{Arg, ArgGroup}, + output::fmt::Colorizer, + parse::features::suggestions, + util::{safe_exit, termcolor::ColorChoice}, +}; /// Short hand for [`Result`] type /// @@ -430,11 +433,11 @@ impl Error { pub fn exit(&self) -> ! { if self.use_stderr() { self.message.print().expect("Error writing Error to stderr"); - process::exit(1); + safe_exit(1); } self.message.print().expect("Error writing Error to stdout"); - process::exit(0); + safe_exit(0) } #[allow(unused)] // requested by @pksunkara diff --git a/src/parse/matches/arg_matches.rs b/src/parse/matches/arg_matches.rs index ce2f3b24..5b29a6d6 100644 --- a/src/parse/matches/arg_matches.rs +++ b/src/parse/matches/arg_matches.rs @@ -1,18 +1,22 @@ // Std -use std::borrow::Cow; -use std::ffi::{OsStr, OsString}; -use std::fmt::{Debug, Display}; -use std::iter::{Cloned, Map}; -use std::slice::Iter; -use std::str::FromStr; +use std::{ + borrow::Cow, + ffi::{OsStr, OsString}, + fmt::{Debug, Display}, + iter::{Cloned, Map}, + slice::Iter, + str::FromStr, +}; // Third Party use indexmap::IndexMap; // Internal -use crate::parse::{MatchedArg, SubCommand}; -use crate::util::{Id, Key}; -use crate::{Error, INVALID_UTF8}; +use crate::{ + parse::{MatchedArg, SubCommand}, + util::{Id, Key}, + {Error, INVALID_UTF8}, +}; /// Used to get information about the arguments that were supplied to the program at runtime by /// the user. New instances of this struct are obtained by using the [`App::get_matches`] family of diff --git a/src/parse/matches/subcommand.rs b/src/parse/matches/subcommand.rs index dbeac921..4eff391a 100644 --- a/src/parse/matches/subcommand.rs +++ b/src/parse/matches/subcommand.rs @@ -1,6 +1,5 @@ // Internal -use crate::util::Id; -use crate::ArgMatches; +use crate::{util::Id, ArgMatches}; /// The abstract representation of a command line subcommand. /// diff --git a/src/parse/parser.rs b/src/parse/parser.rs index d5bce971..7fff483d 100644 --- a/src/parse/parser.rs +++ b/src/parse/parser.rs @@ -1,23 +1,26 @@ // Std -use std::cell::Cell; -use std::ffi::{OsStr, OsString}; -use std::io::Write; +use std::{ + cell::Cell, + ffi::{OsStr, OsString}, + io::Write, +}; // Internal -use crate::build::app::Propagation; -use crate::build::AppSettings as AS; -use crate::build::{App, Arg, ArgSettings}; -use crate::mkeymap::KeyType; -use crate::output::{fmt::Colorizer, Help, HelpWriter, Usage}; -use crate::parse::errors::Error as ClapError; -use crate::parse::errors::ErrorKind; -use crate::parse::errors::Result as ClapResult; -use crate::parse::features::suggestions; -use crate::parse::{ArgMatcher, SubCommand}; -use crate::parse::{Validator, ValueType}; -use crate::util::{termcolor::ColorChoice, ArgStr, ChildGraph, Id}; -use crate::INTERNAL_ERROR_MSG; -use crate::INVALID_UTF8; +use crate::{ + build::app::Propagation, + build::AppSettings as AS, + build::{App, Arg, ArgSettings}, + mkeymap::KeyType, + output::{fmt::Colorizer, Help, HelpWriter, Usage}, + parse::errors::Error as ClapError, + parse::errors::ErrorKind, + parse::errors::Result as ClapResult, + parse::features::suggestions, + parse::{ArgMatcher, SubCommand}, + parse::{Validator, ValueType}, + util::{termcolor::ColorChoice, ArgStr, ChildGraph, Id}, + INTERNAL_ERROR_MSG, INVALID_UTF8, +}; #[derive(Debug, PartialEq, Clone)] pub(crate) enum ParseResult { diff --git a/src/parse/validator.rs b/src/parse/validator.rs index c93ba8d7..c03ccad8 100644 --- a/src/parse/validator.rs +++ b/src/parse/validator.rs @@ -1,13 +1,14 @@ // Internal -use crate::build::app::AppSettings as AS; -use crate::build::{Arg, ArgSettings}; -use crate::output::Usage; -use crate::parse::errors::Result as ClapResult; -use crate::parse::errors::{Error, ErrorKind}; -use crate::parse::{ArgMatcher, MatchedArg, ParseResult, Parser, ValueType}; -use crate::util::{ChildGraph, Id}; -use crate::INTERNAL_ERROR_MSG; -use crate::INVALID_UTF8; +use crate::{ + build::{AppSettings as AS, Arg, ArgSettings}, + output::Usage, + parse::{ + errors::{Error, ErrorKind, Result as ClapResult}, + ArgMatcher, MatchedArg, ParseResult, Parser, ValueType, + }, + util::{ChildGraph, Id}, + INTERNAL_ERROR_MSG, INVALID_UTF8, +}; pub(crate) struct Validator<'b, 'c, 'z> where diff --git a/src/util/argstr.rs b/src/util/argstr.rs index b2816096..098712dc 100644 --- a/src/util/argstr.rs +++ b/src/util/argstr.rs @@ -1,6 +1,8 @@ -use std::borrow::Cow; -use std::ffi::{OsStr, OsString}; -use std::str; +use std::{ + borrow::Cow, + ffi::{OsStr, OsString}, + str, +}; use os_str_bytes::{OsStrBytes, OsStringBytes}; diff --git a/src/util/fnv.rs b/src/util/fnv.rs index fcdc751d..4602300a 100644 --- a/src/util/fnv.rs +++ b/src/util/fnv.rs @@ -1,5 +1,7 @@ -use std::fmt::Display; -use std::hash::{Hash, Hasher}; +use std::{ + fmt::Display, + hash::{Hash, Hasher}, +}; const MAGIC_INIT: u64 = 0x811C_9DC5; diff --git a/src/util/id.rs b/src/util/id.rs index 90117ac1..87835371 100644 --- a/src/util/id.rs +++ b/src/util/id.rs @@ -1,7 +1,10 @@ use crate::util::fnv::Key; -use std::fmt::{Debug, Formatter, Result}; -use std::hash::{Hash, Hasher}; -use std::ops::Deref; + +use std::{ + fmt::{Debug, Formatter, Result}, + hash::{Hash, Hasher}, + ops::Deref, +}; #[derive(Clone, Eq, Default)] #[cfg_attr(not(debug_assertions), derive(Copy), repr(transparent))] diff --git a/src/util/mod.rs b/src/util/mod.rs index 1b9073d8..90cc4640 100644 --- a/src/util/mod.rs +++ b/src/util/mod.rs @@ -15,3 +15,12 @@ pub(crate) use termcolor; #[cfg(not(feature = "color"))] pub(crate) mod termcolor; + +pub(crate) fn safe_exit(code: i32) -> ! { + use std::io::Write; + + let _ = std::io::stdout().lock().flush(); + let _ = std::io::stderr().lock().flush(); + + std::process::exit(code) +}