vortex_array/display/
tree_display.rs1use std::fmt;
5
6use crate::ArrayRef;
7use crate::arrays::Chunked;
8use crate::display::extractor::IndentedFormatter;
9use crate::display::extractor::TreeContext;
10use crate::display::extractor::TreeExtractor;
11use crate::display::extractors::BufferExtractor;
12use crate::display::extractors::EncodingSummaryExtractor;
13use crate::display::extractors::MetadataExtractor;
14use crate::display::extractors::NbytesExtractor;
15use crate::display::extractors::StatsExtractor;
16
17pub struct TreeDisplay {
39 array: ArrayRef,
40 extractors: Vec<Box<dyn TreeExtractor>>,
41}
42
43impl TreeDisplay {
44 pub fn new(array: ArrayRef) -> Self {
49 Self {
50 array,
51 extractors: Vec::new(),
52 }
53 }
54
55 pub fn default_display(array: ArrayRef) -> Self {
58 Self::new(array)
59 .with(EncodingSummaryExtractor)
60 .with(NbytesExtractor)
61 .with(StatsExtractor)
62 .with(MetadataExtractor)
63 .with(BufferExtractor { show_percent: true })
64 }
65
66 pub fn with<E: TreeExtractor + 'static>(mut self, extractor: E) -> Self {
68 self.extractors.push(Box::new(extractor));
69 self
70 }
71
72 pub fn with_boxed(mut self, extractor: Box<dyn TreeExtractor>) -> Self {
74 self.extractors.push(extractor);
75 self
76 }
77
78 fn write_node(
80 &self,
81 name: &str,
82 array: &ArrayRef,
83 ctx: &mut TreeContext,
84 indent: &str,
85 f: &mut fmt::Formatter<'_>,
86 ) -> fmt::Result {
87 write!(f, "{indent}{name}:")?;
89 for extractor in &self.extractors {
90 extractor.write_header(array, ctx, f)?;
91 }
92 writeln!(f)?;
93
94 let child_indent = format!("{indent} ");
96 {
97 let mut indented = IndentedFormatter::new(f, &child_indent);
98 for extractor in &self.extractors {
99 extractor.write_details(array, ctx, &mut indented)?;
100 }
101 }
102
103 let child_size = if array.is::<Chunked>() {
105 None
106 } else {
107 Some(array.nbytes())
108 };
109 ctx.push(child_size);
110
111 for (child_name, child) in array.children_names().into_iter().zip(array.children()) {
113 self.write_node(&child_name, &child, ctx, &child_indent, f)?;
114 }
115
116 ctx.pop();
117
118 Ok(())
119 }
120}
121
122impl fmt::Display for TreeDisplay {
123 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
124 let mut ctx = TreeContext::new();
125 self.write_node("root", &self.array, &mut ctx, "", f)
126 }
127}