|
178 | 178 | //! use anyhow::Context; |
179 | 179 | //! use eccodes::{CodesFile, FallibleIterator, KeyRead, KeyWrite, ProductKind}; |
180 | 180 | //! use std::{collections::HashMap, fs::remove_file, path::Path}; |
181 | | -//! |
| 181 | +//! |
182 | 182 | //! # fn main() -> anyhow::Result<()> { |
183 | 183 | //! // Start by opening the file and creating CodesFile |
184 | 184 | //! let file_path = Path::new("./data/iceland-levels.grib"); |
185 | 185 | //! let mut handle = CodesFile::new_from_file(file_path, ProductKind::GRIB)?; |
186 | | -//! |
| 186 | +//! |
187 | 187 | //! // To build the index we need to collect all messages |
188 | 188 | //! let messages = handle.ref_message_iter().collect::<Vec<_>>()?; |
189 | 189 | //! let mut msg_index = HashMap::new(); |
190 | 190 | //! msg_index.reserve(messages.len()); |
191 | | -//! |
| 191 | +//! |
192 | 192 | //! // Now we can put the messages into a hashmap and index them by shortName and level |
193 | 193 | //! for msg in messages.into_iter() { |
194 | 194 | //! // all messages in this grib are on the same level type |
195 | 195 | //! let short_name: String = msg.read_key("shortName")?; |
196 | 196 | //! let level: i64 = msg.read_key("level")?; |
197 | | -//! |
| 197 | +//! |
198 | 198 | //! msg_index.insert((short_name, level), msg); |
199 | 199 | //! } |
200 | | -//! |
| 200 | +//! |
201 | 201 | //! // Now we can get the values from messages we need |
202 | 202 | //! let t_800: Vec<f64> = msg_index |
203 | 203 | //! .get(&("t".to_string(), 800)) |
|
207 | 207 | //! .get(&("t".to_string(), 800)) |
208 | 208 | //! .context("message missing")? |
209 | 209 | //! .read_key("values")?; |
210 | | -//! |
| 210 | +//! |
211 | 211 | //! // We will also clone t at 700hPa to edit it |
212 | 212 | //! let mut t_850_msg = msg_index |
213 | 213 | //! .get(&("t".to_string(), 700)) |
214 | 214 | //! .context("message missing")? |
215 | 215 | //! .try_clone()?; |
216 | | -//! |
| 216 | +//! |
217 | 217 | //! // Compute temperature at 850hPa |
218 | 218 | //! let t_850_values: Vec<f64> = t_800 |
219 | 219 | //! .iter() |
220 | 220 | //! .zip(t_900.iter()) |
221 | 221 | //! .map(|t| (t.0 + t.1) / 2.0) |
222 | 222 | //! .collect(); |
223 | | -//! |
| 223 | +//! |
224 | 224 | //! // Edit appropriate keys in the cloned (editable) message |
225 | 225 | //! t_850_msg.write_key_unchecked("level", 850)?; |
226 | 226 | //! t_850_msg.write_key_unchecked("values", t_850_values.as_slice())?; |
227 | | -//! |
| 227 | +//! |
228 | 228 | //! // Save the message to a new file without appending |
229 | 229 | //! t_850_msg.write_to_file(Path::new("iceland-850.grib"), false)?; |
230 | 230 | //! # remove_file(Path::new("iceland-850.grib")).unwrap(); |
|
233 | 233 | //! ``` |
234 | 234 | //! |
235 | 235 | //! ## Changes in version 0.14 |
236 | | -//! |
| 236 | +//! |
237 | 237 | //! 1. `experimental_index` feature has been removed - users are encouraged to create their own indexes as shown above or use iterator filtering |
238 | 238 | //! 2. `message_ndarray` feature has been renamed to `ndarray` |
239 | 239 | //! 3. `CodesHandle` has been renamed to `CodesFile` |
@@ -266,7 +266,7 @@ pub mod keys_iterator; |
266 | 266 | mod pointer_guard; |
267 | 267 |
|
268 | 268 | pub use codes_file::{ArcMessageIter, CodesFile, ProductKind, RefMessageIter}; |
269 | | -pub use codes_message::{ArcMessage, BufMessage, KeyRead, KeyWrite, RefMessage, DynamicKeyType}; |
| 269 | +pub use codes_message::{ArcMessage, BufMessage, DynamicKeyType, KeyRead, KeyWrite, RefMessage}; |
270 | 270 | pub use codes_nearest::{CodesNearest, NearestGridpoint}; |
271 | 271 | pub use errors::CodesError; |
272 | 272 | pub use fallible_iterator::{FallibleIterator, IntoFallibleIterator}; |
|
0 commit comments