quickbooks_types/reports/
mod.rs

1//! `QuickBooks` Reports API types
2//!
3//! API reference: <https://developer.intuit.com/app/developer/qbo/docs/api/accounting/report-entities/accountlistdetail>
4
5mod 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!("{:#?}", _report);
66        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}