@@ -13,74 +13,41 @@ use table::*;
1313use tree_table:: * ;
1414
1515use super :: { ChildPosition , Color , ColumnWidthDistribution , TreeHorizontalSlice , Visualizer } ;
16- use crate :: size;
17- use lscolors:: { Indicator , LsColors } ;
16+ use crate :: { size, AnsiPrefixes } ;
1817use std:: {
1918 cmp:: min,
2019 fmt:: { self , Display } ,
2120 hash:: Hash ,
22- sync:: LazyLock ,
2321} ;
2422use zero_copy_pads:: { align_left, align_right, Width } ;
2523
26- struct AnsiPrefixes {
27- directory : String ,
28- normal : String ,
29- executable : String ,
30- symlink : String ,
31- }
32-
33- static ANSI_PREFIXES : LazyLock < AnsiPrefixes > = LazyLock :: new ( || {
34- let ls_colors = LsColors :: from_env ( ) . unwrap_or_default ( ) ;
35- let compute = |indicator : Indicator | {
36- ls_colors
37- . style_for_indicator ( indicator)
38- . map ( |s| s. to_nu_ansi_term_style ( ) . prefix ( ) . to_string ( ) )
39- . unwrap_or_default ( )
40- } ;
41- AnsiPrefixes {
42- directory : compute ( Indicator :: Directory ) ,
43- normal : compute ( Indicator :: RegularFile ) ,
44- executable : compute ( Indicator :: ExecutableFile ) ,
45- symlink : compute ( Indicator :: SymbolicLink ) ,
46- }
47- } ) ;
48-
49- fn color_ansi_prefix ( color : Color ) -> & ' static str {
50- match color {
51- Color :: Directory => & ANSI_PREFIXES . directory ,
52- Color :: Normal => & ANSI_PREFIXES . normal ,
53- Color :: Executable => & ANSI_PREFIXES . executable ,
54- Color :: Symlink => & ANSI_PREFIXES . symlink ,
55- }
56- }
57-
58- struct ColoredSlice < ' a > {
59- slice : & ' a TreeHorizontalSlice < String > ,
24+ struct ColoredTreeHorizontalSlice < ' a > {
25+ slice : TreeHorizontalSlice < String > ,
6026 color : Color ,
27+ ansi_prefixes : & ' a AnsiPrefixes ,
6128}
6229
63- impl fmt:: Display for ColoredSlice < ' _ > {
30+ impl fmt:: Display for ColoredTreeHorizontalSlice < ' _ > {
6431 fn fmt ( & self , f : & mut fmt:: Formatter < ' _ > ) -> fmt:: Result {
6532 let TreeHorizontalSlice {
6633 ancestor_relative_positions,
6734 skeletal_component,
6835 name,
69- } = self . slice ;
36+ } = & self . slice ;
7037 for pos in ancestor_relative_positions {
7138 let connector = match pos {
7239 ChildPosition :: Init => "│ " ,
7340 ChildPosition :: Last => " " ,
7441 } ;
7542 write ! ( f, "{connector}" ) ?;
7643 }
77- let prefix = color_ansi_prefix ( self . color ) ;
78- let suffix = if prefix. is_empty ( ) { "" } else { " \x1b [0m" } ;
44+ let prefix = self . color . ansi_prefix ( self . ansi_prefixes ) ;
45+ let suffix = prefix. suffix ( ) ;
7946 write ! ( f, "{skeletal_component}{prefix}{name}{suffix}" )
8047 }
8148}
8249
83- impl Width for ColoredSlice < ' _ > {
50+ impl Width for ColoredTreeHorizontalSlice < ' _ > {
8451 fn width ( & self ) -> usize {
8552 self . slice . width ( )
8653 }
@@ -151,25 +118,38 @@ where
151118 bar_table
152119 . into_iter ( )
153120 . map ( |row| {
154- let BarRow { tree_row, proportion_bar } = row;
155- let TreeRow { initial_row, tree_horizontal_slice : slice } = tree_row;
156-
157- let node_color = self . coloring . and_then ( |coloring| {
158- if initial_row. node_info . children_count > 0 {
121+ let BarRow {
122+ tree_row,
123+ proportion_bar,
124+ } = row;
125+ let TreeRow {
126+ initial_row,
127+ tree_horizontal_slice,
128+ } = tree_row;
129+
130+ let colored = self . coloring . and_then ( |coloring| {
131+ let color = if initial_row. node_info . children_count > 0 {
159132 Some ( Color :: Directory )
160133 } else {
161- coloring. get ( initial_row. node_info . name ) . copied ( )
162- }
134+ coloring. map . get ( initial_row. node_info . name ) . copied ( )
135+ } ?;
136+ Some ( ( color, & coloring. ansi_prefixes ) )
163137 } ) ;
164138
165139 let aligned_colored_slice;
166140 let aligned_plain_slice;
167- let tree = if let Some ( color) = node_color {
168- aligned_colored_slice =
169- align_left ( ColoredSlice { slice : & slice, color } , tree_width) ;
141+ let tree = if let Some ( ( color, ansi_prefixes) ) = colored {
142+ aligned_colored_slice = align_left (
143+ ColoredTreeHorizontalSlice {
144+ slice : tree_horizontal_slice,
145+ color,
146+ ansi_prefixes,
147+ } ,
148+ tree_width,
149+ ) ;
170150 format_args ! ( "{aligned_colored_slice}" )
171151 } else {
172- aligned_plain_slice = align_left ( & slice , tree_width) ;
152+ aligned_plain_slice = align_left ( & tree_horizontal_slice , tree_width) ;
173153 format_args ! ( "{aligned_plain_slice}" )
174154 } ;
175155
0 commit comments