tree_table/api/
data_get_cloned.rs1use alloc::string::ToString;
2use alloc::{string::String, vec, vec::Vec};
3
4use crate::args::{GetDataIidsArgs, GetDataSpanArgs, GetDataYxArgs};
5use crate::{CellKey, SpanKey, Table, Val};
6
7impl Table {
8 pub fn get_data_iids_cloned(
10 &self,
11 kwargs: Option<GetDataIidsArgs>,
12 ) -> Result<Vec<(String, Vec<(String, Val)>)>, String> {
13 let empty_val = &self.opts.empty_val;
14 let mut result: Vec<(String, Vec<(String, Val)>)> = Vec::new();
15 match kwargs {
16 Some(kwargs) => {
17 if kwargs.ignore_invalid {
18 for (row_iid, cols) in kwargs.rows.into_iter() {
19 let Ok(rn) = Self::acr_pos(&self.grid.index.iid_to_row, &row_iid) else {
20 continue;
21 };
22 let mut row_result: Vec<(String, Val)> = Vec::new();
23 for col_iid in cols.into_iter() {
24 let Ok(cn) = Self::acr_pos(&self.grid.header.iid_to_col, &col_iid)
25 else {
26 continue;
27 };
28 row_result.push((
29 col_iid,
30 Self::acr_tcell_val_cloned(&self.grid.index.cells, rn, cn)
31 .unwrap_or_else(|| empty_val.clone()),
32 ));
33 }
34 result.push((row_iid, row_result));
35 }
36 } else {
37 for (row_iid, cols) in kwargs.rows.into_iter() {
38 let rn = Self::acr_pos(&self.grid.index.iid_to_row, &row_iid)?;
39 let mut row_result: Vec<(String, Val)> = Vec::new();
40 for col_iid in cols.into_iter() {
41 let cn = Self::acr_pos(&self.grid.header.iid_to_col, &col_iid)?;
42 row_result.push((
43 col_iid,
44 Self::acr_tcell_val_cloned(&self.grid.index.cells, rn, cn)
45 .unwrap_or_else(|| empty_val.clone()),
46 ));
47 }
48 result.push((row_iid, row_result));
49 }
50 }
51 }
52 None => {
53 let num_cols = Self::acr_total_cols(&self.grid.header.cells);
54 for (rn, icell) in self.grid.index.cells.iter().enumerate() {
55 let mut row_result: Vec<(String, Val)> = Vec::new();
56 for cn in 0..num_cols {
57 row_result.push((
58 Self::acr_borrow_ciid(&self.grid.header.cells, cn)?.to_string(),
59 Self::acr_tcell_val_cloned(&self.grid.index.cells, rn, cn)
60 .unwrap_or_else(|| empty_val.clone()),
61 ))
62 }
63 result.push((icell.iid.to_string(), row_result));
64 }
65 }
66 }
67 Ok(result)
68 }
69
70 pub fn get_data_yx_cloned(
72 &self,
73 kwargs: Option<GetDataYxArgs>,
74 ) -> Result<Vec<(CellKey, Val)>, String> {
75 let empty_val = &self.opts.empty_val;
76 let mut result: Vec<(CellKey, Val)> = Vec::new();
77 if let Some(kwargs) = kwargs {
78 for key in kwargs.coords.into_iter() {
79 let rn = key.0 as usize;
80 let cn = key.1 as usize;
81 result.push((
82 key,
83 Self::acr_tcell_val_cloned(&self.grid.index.cells, rn, cn)
84 .unwrap_or_else(|| empty_val.clone()),
85 ));
86 }
87 } else {
88 let num_rows = Self::acr_total_rows(&self.grid.index.cells);
89 let num_cols = Self::acr_total_cols(&self.grid.header.cells);
90 for rn in 0..num_rows {
91 for cn in 0..num_cols {
92 result.push((
93 CellKey(rn as u64, cn as u64),
94 Self::acr_tcell_val_cloned(&self.grid.index.cells, rn, cn)
95 .unwrap_or_else(|| empty_val.clone()),
96 ));
97 }
98 }
99 }
100 Ok(result)
101 }
102
103 pub fn get_data_span_cloned(
105 &self,
106 kwargs: Option<GetDataSpanArgs>,
107 ) -> Result<Vec<Vec<Val>>, String> {
108 let kwargs = kwargs.unwrap_or(GetDataSpanArgs {
109 key: SpanKey::None,
110 index: true,
111 header: true,
112 transpose: false,
113 table: true,
114 });
115 let empty_val = &self.opts.empty_val;
116 let mut result: Vec<Vec<Val>> = Vec::new();
117 let span = self.cr_key_to_span(kwargs.key)?;
118 let (r_start, r_end) = span.rows_start_end(&self.grid);
119 let (c_start, c_end) = span.cols_start_end(&self.grid);
120
121 if kwargs.transpose {
123 if kwargs.index {
124 let mut index_row = if kwargs.header {
125 vec![empty_val.clone()]
126 } else {
127 vec![]
128 };
129 for r in r_start..r_end {
130 index_row.push(Self::acr_icell_val_cloned(&self.grid.index.cells, r)?);
131 }
132 result.push(index_row);
133 }
134 if kwargs.header || kwargs.table {
135 for col in c_start..c_end {
136 let mut col_data: Vec<Val> = Vec::new();
137 if kwargs.header {
138 col_data.push(Self::acr_hcell_val(&self.grid.header.cells, col)?.clone());
139 }
140 if kwargs.table {
141 col_data.extend((r_start..r_end).map(|r| {
142 Self::acr_tcell_val_cloned(&self.grid.index.cells, r, col)
143 .unwrap_or_else(|| empty_val.clone())
144 }));
145 }
146 result.push(col_data);
147 }
148 }
149 } else {
151 if kwargs.header {
152 let mut header_row: Vec<Val> = if kwargs.index {
153 vec![empty_val.clone()]
154 } else {
155 vec![]
156 };
157 for c in c_start..c_end {
158 header_row.push(Self::acr_hcell_val(&self.grid.header.cells, c)?.clone());
159 }
160 result.push(header_row);
161 }
162 if kwargs.index || kwargs.table {
163 for row in r_start..r_end {
164 let mut row_data: Vec<Val> = Vec::new();
165 if kwargs.index {
166 row_data.push(Self::acr_icell_val_cloned(&self.grid.index.cells, row)?);
167 }
168 if kwargs.table {
169 row_data.extend((c_start..c_end).map(|c| {
170 Self::acr_tcell_val_cloned(&self.grid.index.cells, row, c)
171 .unwrap_or_else(|| empty_val.clone())
172 }));
173 }
174 result.push(row_data);
175 }
176 }
177 }
178 Ok(result)
179 }
180}