1use std::path::PathBuf;
7
8use anyhow::Result;
9use console::style;
10
11use crate::vars::{VarExpander, VarResolver, VarsFile};
12
13#[derive(Debug, Clone)]
15pub struct ChainOptions {
16 pub name: String,
18 pub vars: PathBuf,
20 pub tree: bool,
22}
23
24pub fn execute_chain(options: ChainOptions) -> Result<()> {
26 let vars_file = VarsFile::from_json(&options.vars)?;
27 let resolver = VarResolver::new(vars_file);
28 let expander = VarExpander::new(resolver);
29
30 let name = options.name.trim_start_matches('$');
31 let chain = expander.get_inheritance_chain(name);
32
33 if options.tree {
34 println!("{}", style(format!("${}", name)).cyan().bold());
35 print_chain_tree(&chain.chain, 0);
36 } else {
37 println!("Root: {}", style(&chain.root).cyan());
38 println!("Depth: {}", chain.depth);
39 println!("Chain: {}", chain.chain.join(" → "));
40 }
41
42 Ok(())
43}
44
45fn print_chain_tree(chain: &[String], depth: usize) {
47 for (i, item) in chain.iter().enumerate() {
48 let prefix = if i == chain.len() - 1 {
49 "└── "
50 } else {
51 "├── "
52 };
53 let indent = " ".repeat(depth);
54 println!("{}{}{}", indent, prefix, style(item).dim());
55 }
56}