convert ArgMatches to Options
impl Options {fn from_matches(matches: &ArgMatches) -> CopyResult<Options> {let not_implemented_opts = vec![OPT_COPY_CONTENTS,OPT_SPARSE,#[cfg(not(any(windows, unix)))]OPT_ONE_FILE_SYSTEM,OPT_CONTEXT,#[cfg(windows)]OPT_FORCE,];for not_implemented_opt in not_implemented_opts {if matches.is_present(not_implemented_opt) {return Err(Error::NotImplemented(not_implemented_opt.to_string()));}}let recursive = matches.is_present(OPT_RECURSIVE)|| matches.is_present(OPT_RECURSIVE_ALIAS)|| matches.is_present(OPT_ARCHIVE);let backup = matches.is_present(OPT_BACKUP) || (matches.occurrences_of(OPT_SUFFIX) > 0);// Parse target directory optionslet no_target_dir = matches.is_present(OPT_NO_TARGET_DIRECTORY);let target_dir = matches.value_of(OPT_TARGET_DIRECTORY).map(ToString::to_string);// Parse attributes to preservelet preserve_attributes: Vec<Attribute> = if matches.is_present(OPT_PRESERVE) {match matches.values_of(OPT_PRESERVE) {None => DEFAULT_ATTRIBUTES.to_vec(),Some(attribute_strs) => {let mut attributes = Vec::new();for attribute_str in attribute_strs {if attribute_str == "all" {attributes = add_all_attributes();break;} else {attributes.push(Attribute::from_str(attribute_str)?);}}attributes}}} else if matches.is_present(OPT_ARCHIVE) {// --archive is used. Same as --preserve=alladd_all_attributes()} else if matches.is_present(OPT_NO_DEREFERENCE_PRESERVE_LINKS) {vec![Attribute::Links]} else if matches.is_present(OPT_PRESERVE_DEFAULT_ATTRIBUTES) {DEFAULT_ATTRIBUTES.to_vec()} else {vec![]};let options = Options {attributes_only: matches.is_present(OPT_ATTRIBUTES_ONLY),copy_contents: matches.is_present(OPT_COPY_CONTENTS),copy_mode: CopyMode::from_matches(matches),dereference: matches.is_present(OPT_DEREFERENCE),// No dereference is set with -p, -d and --archiveno_dereference: matches.is_present(OPT_NO_DEREFERENCE)|| matches.is_present(OPT_NO_DEREFERENCE_PRESERVE_LINKS)|| matches.is_present(OPT_ARCHIVE),one_file_system: matches.is_present(OPT_ONE_FILE_SYSTEM),overwrite: OverwriteMode::from_matches(matches),parents: matches.is_present(OPT_PARENTS),backup_suffix: matches.value_of(OPT_SUFFIX).unwrap().to_string(),update: matches.is_present(OPT_UPDATE),verbose: matches.is_present(OPT_VERBOSE),strip_trailing_slashes: matches.is_present(OPT_STRIP_TRAILING_SLASHES),reflink: matches.is_present(OPT_REFLINK),reflink_mode: {if let Some(reflink) = matches.value_of(OPT_REFLINK) {match reflink {"always" => ReflinkMode::Always,"auto" => ReflinkMode::Auto,value => {return Err(Error::InvalidArgument(format!("invalid argument '{}' for \'reflink\'",value)));}}} else {ReflinkMode::Never}},backup,no_target_dir,preserve_attributes,recursive,target_dir,};Ok(options)}}
