refactor(tree): replace previous depth: u32 opts with new type DisplayDepth

refactor(tree): replace previous `depth: u32` opts with new type `DisplayDepth`
This commit is contained in:
Shoyu Vanilla 2024-12-13 04:26:50 +09:00
parent 1c0f6cfdcc
commit fc00223fca
2 changed files with 44 additions and 9 deletions

View File

@ -2,7 +2,7 @@ use crate::cli;
use crate::command_prelude::*; use crate::command_prelude::*;
use anyhow::{bail, format_err}; use anyhow::{bail, format_err};
use cargo::core::dependency::DepKind; use cargo::core::dependency::DepKind;
use cargo::ops::tree::{self, EdgeKind}; use cargo::ops::tree::{self, DisplayDepth, EdgeKind};
use cargo::ops::Packages; use cargo::ops::Packages;
use cargo::util::print_available_packages; use cargo::util::print_available_packages;
use cargo::util::CargoResult; 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 pkgs_to_prune = args._values_of("prune");
let display_depth = args
._value_of("depth")
.map(|s| s.parse::<DisplayDepth>())
.transpose()?
.unwrap_or(DisplayDepth::MaxDisplayDepth(u32::MAX));
let packages = args.packages_from_flags()?; let packages = args.packages_from_flags()?;
let mut invert = args let mut invert = args
.get_many::<String>("invert") .get_many::<String>("invert")
@ -222,7 +228,7 @@ subtree of the package given to -p.\n\
duplicates: args.flag("duplicates"), duplicates: args.flag("duplicates"),
format: args.get_one::<String>("format").cloned().unwrap(), format: args.get_one::<String>("format").cloned().unwrap(),
graph_features, graph_features,
max_display_depth: args.value_of_u32("depth")?.unwrap_or(u32::MAX), display_depth,
no_proc_macro, no_proc_macro,
}; };

View File

@ -43,8 +43,9 @@ pub struct TreeOptions {
pub format: String, pub format: String,
/// Includes features in the tree as separate nodes. /// Includes features in the tree as separate nodes.
pub graph_features: bool, pub graph_features: bool,
/// Maximum display depth of the dependency tree. /// Display depth of the dependency tree.
pub max_display_depth: u32, /// If non-negative integer, display dependencies with that amount of max depth.
pub display_depth: DisplayDepth,
/// Excludes proc-macro dependencies. /// Excludes proc-macro dependencies.
pub no_proc_macro: bool, 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<Self, Self::Err> {
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 { struct Symbols {
down: &'static str, down: &'static str,
tee: &'static str, tee: &'static str,
@ -250,7 +275,7 @@ fn print(
pkgs_to_prune, pkgs_to_prune,
opts.prefix, opts.prefix,
opts.no_dedupe, opts.no_dedupe,
opts.max_display_depth, opts.display_depth,
&mut visited_deps, &mut visited_deps,
&mut levels_continue, &mut levels_continue,
&mut print_stack, &mut print_stack,
@ -270,7 +295,7 @@ fn print_node<'a>(
pkgs_to_prune: &[PackageIdSpec], pkgs_to_prune: &[PackageIdSpec],
prefix: Prefix, prefix: Prefix,
no_dedupe: bool, no_dedupe: bool,
max_display_depth: u32, display_depth: DisplayDepth,
visited_deps: &mut HashSet<usize>, visited_deps: &mut HashSet<usize>,
levels_continue: &mut Vec<bool>, levels_continue: &mut Vec<bool>,
print_stack: &mut Vec<usize>, print_stack: &mut Vec<usize>,
@ -329,7 +354,7 @@ fn print_node<'a>(
pkgs_to_prune, pkgs_to_prune,
prefix, prefix,
no_dedupe, no_dedupe,
max_display_depth, display_depth,
visited_deps, visited_deps,
levels_continue, levels_continue,
print_stack, print_stack,
@ -349,7 +374,7 @@ fn print_dependencies<'a>(
pkgs_to_prune: &[PackageIdSpec], pkgs_to_prune: &[PackageIdSpec],
prefix: Prefix, prefix: Prefix,
no_dedupe: bool, no_dedupe: bool,
max_display_depth: u32, display_depth: DisplayDepth,
visited_deps: &mut HashSet<usize>, visited_deps: &mut HashSet<usize>,
levels_continue: &mut Vec<bool>, levels_continue: &mut Vec<bool>,
print_stack: &mut Vec<usize>, print_stack: &mut Vec<usize>,
@ -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. // Current level exceeds maximum display depth. Skip.
if levels_continue.len() + 1 > max_display_depth as usize { if levels_continue.len() + 1 > max_display_depth as usize {
return; return;
@ -407,7 +436,7 @@ fn print_dependencies<'a>(
pkgs_to_prune, pkgs_to_prune,
prefix, prefix,
no_dedupe, no_dedupe,
max_display_depth, display_depth,
visited_deps, visited_deps,
levels_continue, levels_continue,
print_stack, print_stack,