From fc00223fca7bb7e927aeda2ff1810187ac0d7c4c Mon Sep 17 00:00:00 2001 From: Shoyu Vanilla Date: Fri, 13 Dec 2024 04:26:50 +0900 Subject: [PATCH] refactor(tree): replace previous `depth: u32` opts with new type `DisplayDepth` refactor(tree): replace previous `depth: u32` opts with new type `DisplayDepth` --- src/bin/cargo/commands/tree.rs | 10 ++++++-- src/cargo/ops/tree/mod.rs | 43 ++++++++++++++++++++++++++++------ 2 files changed, 44 insertions(+), 9 deletions(-) diff --git a/src/bin/cargo/commands/tree.rs b/src/bin/cargo/commands/tree.rs index b0f35370ebc..98b21db6c73 100644 --- a/src/bin/cargo/commands/tree.rs +++ b/src/bin/cargo/commands/tree.rs @@ -2,7 +2,7 @@ use crate::cli; use crate::command_prelude::*; use anyhow::{bail, format_err}; use cargo::core::dependency::DepKind; -use cargo::ops::tree::{self, EdgeKind}; +use cargo::ops::tree::{self, DisplayDepth, EdgeKind}; use cargo::ops::Packages; use cargo::util::print_available_packages; use cargo::util::CargoResult; @@ -162,6 +162,12 @@ pub fn exec(gctx: &mut GlobalContext, args: &ArgMatches) -> CliResult { let pkgs_to_prune = args._values_of("prune"); + let display_depth = args + ._value_of("depth") + .map(|s| s.parse::()) + .transpose()? + .unwrap_or(DisplayDepth::MaxDisplayDepth(u32::MAX)); + let packages = args.packages_from_flags()?; let mut invert = args .get_many::("invert") @@ -222,7 +228,7 @@ subtree of the package given to -p.\n\ duplicates: args.flag("duplicates"), format: args.get_one::("format").cloned().unwrap(), graph_features, - max_display_depth: args.value_of_u32("depth")?.unwrap_or(u32::MAX), + display_depth, no_proc_macro, }; diff --git a/src/cargo/ops/tree/mod.rs b/src/cargo/ops/tree/mod.rs index 0940f0ebfad..4ffb235c1d8 100644 --- a/src/cargo/ops/tree/mod.rs +++ b/src/cargo/ops/tree/mod.rs @@ -43,8 +43,9 @@ pub struct TreeOptions { pub format: String, /// Includes features in the tree as separate nodes. pub graph_features: bool, - /// Maximum display depth of the dependency tree. - pub max_display_depth: u32, + /// Display depth of the dependency tree. + /// If non-negative integer, display dependencies with that amount of max depth. + pub display_depth: DisplayDepth, /// Excludes proc-macro dependencies. pub no_proc_macro: bool, } @@ -86,6 +87,30 @@ impl FromStr for Prefix { } } +#[derive(Clone, Copy)] +pub enum DisplayDepth { + MaxDisplayDepth(u32), +} + +impl FromStr for DisplayDepth { + type Err = clap::Error; + + fn from_str(s: &str) -> Result { + match s { + s => s.parse().map(Self::MaxDisplayDepth).map_err(|_| { + clap::Error::raw( + clap::error::ErrorKind::ValueValidation, + format!( + "supported values for --depth are non-negative integers, \ + but `{}` is unknown", + s + ), + ) + }), + } + } +} + struct Symbols { down: &'static str, tee: &'static str, @@ -250,7 +275,7 @@ fn print( pkgs_to_prune, opts.prefix, opts.no_dedupe, - opts.max_display_depth, + opts.display_depth, &mut visited_deps, &mut levels_continue, &mut print_stack, @@ -270,7 +295,7 @@ fn print_node<'a>( pkgs_to_prune: &[PackageIdSpec], prefix: Prefix, no_dedupe: bool, - max_display_depth: u32, + display_depth: DisplayDepth, visited_deps: &mut HashSet, levels_continue: &mut Vec, print_stack: &mut Vec, @@ -329,7 +354,7 @@ fn print_node<'a>( pkgs_to_prune, prefix, no_dedupe, - max_display_depth, + display_depth, visited_deps, levels_continue, print_stack, @@ -349,7 +374,7 @@ fn print_dependencies<'a>( pkgs_to_prune: &[PackageIdSpec], prefix: Prefix, no_dedupe: bool, - max_display_depth: u32, + display_depth: DisplayDepth, visited_deps: &mut HashSet, levels_continue: &mut Vec, print_stack: &mut Vec, @@ -378,6 +403,10 @@ fn print_dependencies<'a>( } } + let max_display_depth = match display_depth { + DisplayDepth::MaxDisplayDepth(max) => max, + }; + // Current level exceeds maximum display depth. Skip. if levels_continue.len() + 1 > max_display_depth as usize { return; @@ -407,7 +436,7 @@ fn print_dependencies<'a>( pkgs_to_prune, prefix, no_dedupe, - max_display_depth, + display_depth, visited_deps, levels_continue, print_stack,