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 }
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 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)?; 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 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 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}