Skip to main content

tree_table/api/
data_get_cloned.rs

1use 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    /// Gets row data using an array of row ids or positions.
9    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    /// Gets table cell data using cell coordinates.
71    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    /// Gets data as a 2d array using a key.
104    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        // Sub-arrays are columns
122        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        // Sub-arrays are rows
150        } 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}