eorst/rasterdataset/
impl_methods.rs

1use crate::core_types::RasterType;
2use crate::data_sources::DateType;
3use crate::rasterdataset::RasterDataset;
4use colored::*;
5use std::any::type_name;
6
7impl std::fmt::Display for DateType {
8    fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::result::Result<(), std::fmt::Error> {
9        let str = match self {
10            DateType::Date(date) => {
11                format!("{}", date.format("%Y-%m-%d %H:%M:%S"))
12            }
13            DateType::Index(index) => format!("{}", index),
14        };
15        write!(fmt, "{}", str)
16        //writeln!(fmt, "")
17    }
18}
19
20impl<T> std::fmt::Display for RasterDataset<T>
21where
22    T: RasterType,
23{
24    fn fmt(&self, fmt: &mut std::fmt::Formatter) -> std::result::Result<(), std::fmt::Error> {
25        writeln!(fmt, "{}", "Summary".bold().underline())?;
26
27        // -------------------------
28        // Quick multi-line summary
29        // -------------------------
30        writeln!(
31            fmt,
32            "{:<20} : {}x{} pixels",
33            "Size".cyan(),
34            self.metadata.shape.rows,
35            self.metadata.shape.cols
36        )?;
37        writeln!(
38            fmt,
39            "{:<20} : {} layers",
40            "Layers".cyan(),
41            self.metadata.shape.layers
42        )?;
43        writeln!(
44            fmt,
45            "{:<20} : {} time(s)",
46            "Time steps".cyan(),
47            self.metadata.shape.times
48        )?;
49        writeln!(
50            fmt,
51            "{:<20} : {} block(s)",
52            "Blocks".cyan(),
53            self.blocks.len()
54        )?;
55        writeln!(fmt, "{:<20} : {}", "Data type".cyan(), type_name::<T>())?;
56        writeln!(
57            fmt,
58            "{:<20} : {}",
59            "Null Value".cyan(),
60            self.metadata.na_value
61        )?;
62
63        writeln!(
64            fmt,
65            "{:<20} : EPSG:{}",
66            "EPSG code".cyan(),
67            self.metadata.epsg_code
68        )?;
69
70        writeln!(fmt)?; // empty line before detailed table
71
72        // -------------------------
73        // Layer indices (summarized)
74        // -------------------------
75        let layer_indices_str = if self.metadata.layer_indices.len() > 5 {
76            format!(
77                "{} ... (+{} more)",
78                self.metadata.layer_indices[..5].join(", "),
79                self.metadata.layer_indices.len() - 5
80            )
81        } else {
82            self.metadata.layer_indices.join(", ")
83        };
84
85        // -------------------------
86        // Time indices (summarized)
87        // -------------------------
88        let time_indices_str = if self.metadata.date_indices.len() > 5 {
89            self.metadata.date_indices[..5]
90                .iter()
91                .map(|val| match val {
92                    DateType::Date(date) => format!("{}", date.format("%Y-%m-%d %H:%M:%S")),
93                    DateType::Index(idx) => idx.to_string(),
94                })
95                .collect::<Vec<_>>()
96                .join(", ")
97                + &format!(" ... (+{} more)", self.metadata.date_indices.len() - 5)
98        } else {
99            self.metadata
100                .date_indices
101                .iter()
102                .map(|val| match val {
103                    DateType::Date(date) => format!("{}", date.format("%Y-%m-%d %H:%M:%S")),
104                    DateType::Index(idx) => idx.to_string(),
105                })
106                .collect::<Vec<_>>()
107                .join(", ")
108        };
109
110        // -------------------------
111        // Detailed attribute table
112        // -------------------------
113        writeln!(fmt, "{}", "Details".bold().underline())?;
114
115        let table = vec![
116            (
117                "Dataset shape",
118                format!(
119                    "times: {}, layers: {}, rows: {}, cols: {}",
120                    self.metadata.shape.times,
121                    self.metadata.shape.layers,
122                    self.metadata.shape.rows,
123                    self.metadata.shape.cols
124                ),
125            ),
126            ("Layer indices", layer_indices_str),
127            ("Time indices", time_indices_str),
128            (
129                "Block size",
130                format!(
131                    "{}x{}",
132                    self.metadata.block_size.rows, self.metadata.block_size.cols
133                ),
134            ),
135            ("Number of blocks", self.blocks.len().to_string()),
136            (
137                "GeoTransform",
138                format!(
139                    "{:>2}, {:>2}, {:>2}, {:>2}, {:>2}, {:>2}",
140                    self.metadata.geo_transform.x_res,
141                    self.metadata.geo_transform.x_rot,
142                    self.metadata.geo_transform.x_ul,
143                    self.metadata.geo_transform.y_rot,
144                    self.metadata.geo_transform.y_res,
145                    self.metadata.geo_transform.y_ul
146                ),
147            ),
148        ];
149
150        for (key, value) in table {
151            writeln!(fmt, "{:<20} : {}", key.bold(), value)?;
152        }
153
154        Ok(())
155    }
156}