quickbooks_types/reports/
mod.rs1mod models;
6pub mod params;
7pub mod types;
8pub use models::*;
9
10#[cfg(feature = "polars")]
11mod polars;
12#[cfg(feature = "polars")]
13pub use polars::QBPolarsError;
14
15impl Report {
16 #[must_use]
17 pub fn name(&self) -> Option<&str> {
18 self.header.as_ref().and_then(|h| h.report_name.as_deref())
19 }
20
21 #[must_use]
22 pub fn col_data(&self, column: &str) -> Option<impl Iterator<Item = &ColData>> {
23 let index = self
24 .columns
25 .as_ref()?
26 .column
27 .as_ref()?
28 .iter()
29 .position(|c| c.col_title == column)?;
30 self.row_data()
31 .map(|rows| rows.filter_map(move |row| row.get(index)))
32 }
33
34 #[must_use]
35 pub fn column_names(&self) -> Option<impl Iterator<Item = &str>> {
36 self.columns
37 .as_ref()?
38 .column
39 .as_ref()
40 .map(|cols| cols.iter().map(|c| c.col_title.as_str()))
41 }
42
43 #[must_use]
44 pub fn row_data(&self) -> Option<impl Iterator<Item = &[ColData]>> {
45 self.rows.as_ref()?.row.as_ref().map(|rows| {
46 rows.iter().filter_map(|row| {
47 if let RowContent::Coldata { col_data } = &row.content {
48 Some(col_data.as_slice())
49 } else {
50 None
51 }
52 })
53 })
54 }
55}
56
57#[cfg(test)]
58mod tests {
59 #[test]
60 fn test_report_ser_de() {
61 let input = include_str!("../../test/data/report1.json");
62 let input_value = serde_json::from_str::<serde_json::Value>(input).unwrap();
63
64 let _report: super::Report = serde_json::from_value(input_value.clone()).unwrap();
65 println!("{}", serde_json::to_string_pretty(&_report).unwrap());
67 assert_eq!(input_value, serde_json::to_value(&_report).unwrap());
68 }
69
70 #[test]
71 fn test_report_column_names() {
72 let input = include_str!("../../test/data/report1.json");
73 let report: super::Report = serde_json::from_str(input).unwrap();
74 let column_names: Vec<_> = report.column_names().unwrap().collect();
75 assert!(!column_names.is_empty());
76 println!("{:?}", column_names);
77 }
78}