Skip to content

Commit 99ae049

Browse files
authored
Remove unwrap (catching I/O error nicely) (#377)
* Remove unwrap (catching I/O error nicely) * This may raise when falsely invoking from_file from a Gzip header * or invoking from_gzip_file from a readable header * bump to v0.20.2 * epoch: use epoch.to_gregorian directly * hatanaka: remove unwrap from textdiff, iterating correctly * Fix a few warnings --------- Signed-off-by: Guillaume W. Bres <[email protected]>
1 parent ddaca02 commit 99ae049

File tree

12 files changed

+55
-62
lines changed

12 files changed

+55
-62
lines changed

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "rinex"
3-
version = "0.20.1"
3+
version = "0.20.2"
44
license = "MPL-2.0"
55
authors = ["Guillaume W. Bres <[email protected]>"]
66
description = "RINEX file parsing, analysis and production"

src/epoch.rs

Lines changed: 12 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,6 @@ use crate::{
55
types::Type,
66
};
77

8-
use std::str::FromStr;
9-
108
/// Infaillible `Epoch::now()` call.
119
pub(crate) fn now() -> Epoch {
1210
Epoch::now().unwrap_or(Epoch::from_gregorian_utc_at_midnight(2000, 1, 1))
@@ -265,38 +263,8 @@ pub(crate) fn parse_ionex_utc(s: &str) -> Result<Epoch, ParsingError> {
265263
Ok(Epoch::from_gregorian_utc(y, m, d, hh, mm, ss, 0))
266264
}
267265

268-
/*
269-
* Until Hifitime provides a decomposition method in timescale other than UTC
270-
* we have this tweak to decompose %Y %M %D %HH %MM %SS and without nanoseconds
271-
*/
272-
pub(crate) fn epoch_decompose(e: Epoch) -> (i32, u8, u8, u8, u8, u8, u32) {
273-
let isofmt = e.to_gregorian_str(e.time_scale);
274-
let mut datetime = isofmt.split('T');
275-
let date = datetime.next().unwrap();
276-
let mut date = date.split('-');
277-
278-
let time = datetime.next().unwrap();
279-
let mut time_scale = time.split(' ');
280-
let time = time_scale.next().unwrap();
281-
let mut time = time.split(':');
282-
283-
let years = date.next().unwrap().parse::<i32>().unwrap();
284-
let months = date.next().unwrap().parse::<u8>().unwrap();
285-
let days = date.next().unwrap().parse::<u8>().unwrap();
286-
287-
let hours = time.next().unwrap().parse::<u8>().unwrap();
288-
let mins = time.next().unwrap().parse::<u8>().unwrap();
289-
let seconds = f64::from_str(time.next().unwrap()).unwrap();
290-
291-
(
292-
years,
293-
months,
294-
days,
295-
hours,
296-
mins,
297-
seconds.floor() as u8,
298-
(seconds.fract() * 1E9).round() as u32,
299-
)
266+
pub(crate) fn epoch_decompose(epoch: Epoch) -> (i32, u8, u8, u8, u8, u8, u32) {
267+
epoch.to_gregorian(epoch.time_scale)
300268
}
301269

302270
#[cfg(test)]
@@ -336,6 +304,7 @@ mod test {
336304
assert_eq!(e.time_scale, TimeScale::UTC);
337305
assert_eq!(format(e, Type::NavigationData, 2), "21 1 1 16 15 0.0");
338306
}
307+
339308
#[test]
340309
fn epoch_parse_nav_v2_nanos() {
341310
let e = parse_utc("20 12 31 23 45 0.1");
@@ -346,6 +315,7 @@ mod test {
346315
assert_eq!(ns, 100_000_000);
347316
assert_eq!(format(e, Type::NavigationData, 2), "20 12 31 23 45 0.1");
348317
}
318+
349319
#[test]
350320
fn epoch_parse_nav_v3() {
351321
let e = parse_utc("2021 01 01 00 00 00 ");
@@ -401,6 +371,7 @@ mod test {
401371
assert_eq!(ns, 0);
402372
assert_eq!(format(e, Type::NavigationData, 3), "2020 06 25 09 49 04");
403373
}
374+
404375
#[test]
405376
fn epoch_parse_obs_v2() {
406377
let e = parse_utc(" 21 12 21 0 0 0.0000000");
@@ -468,6 +439,7 @@ mod test {
468439
"21 1 1 0 7 30.0000000"
469440
);
470441
}
442+
471443
#[test]
472444
fn epoch_parse_obs_v3() {
473445
let e = parse_utc(" 2022 01 09 00 00 0.0000000");
@@ -534,6 +506,7 @@ mod test {
534506
"2022 03 04 00 02 30.0000000"
535507
);
536508
}
509+
537510
#[test]
538511
fn epoch_parse_obs_v2_nanos() {
539512
let e = parse_utc(" 21 1 1 0 7 39.1234567");
@@ -547,6 +520,7 @@ mod test {
547520
"21 1 1 0 7 39.1234567"
548521
);
549522
}
523+
550524
#[test]
551525
fn epoch_parse_obs_v3_nanos() {
552526
let e = parse_utc("2022 01 09 00 00 0.1000000");
@@ -582,6 +556,7 @@ mod test {
582556
"2022 01 09 00 00 8.7654321"
583557
);
584558
}
559+
585560
#[test]
586561
fn epoch_parse_meteo_v2() {
587562
let e = parse_utc(" 22 1 4 0 0 0 ");
@@ -597,6 +572,7 @@ mod test {
597572
assert_eq!(ns, 0);
598573
assert_eq!(format(e, Type::MeteoData, 2), "22 1 4 0 0 0");
599574
}
575+
600576
#[test]
601577
fn ionex_parsing() {
602578
for (desc, expected) in [(
@@ -609,6 +585,7 @@ mod test {
609585
assert_eq!(epoch, expected, "invalid IONEX/UTC epoch");
610586
}
611587
}
588+
612589
#[test]
613590
fn epoch_decomposition() {
614591
for (epoch, y, m, d, hh, mm, ss, ns) in [
@@ -630,6 +607,7 @@ mod test {
630607
);
631608
}
632609
}
610+
633611
#[test]
634612
fn test_formatted_month() {
635613
assert_eq!(parse_formatted_month("Jan").unwrap(), 1);

src/hatanaka/textdiff.rs

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -85,15 +85,17 @@ impl TextDiff {
8585
let mut compressed = self.compressed.as_bytes_mut().iter_mut();
8686

8787
while let Some(buffered) = buffered.next() {
88-
let byte = bytes.next().unwrap();
89-
let compressed = compressed.next().unwrap();
90-
if byte == buffered {
91-
*compressed = b' ';
92-
} else {
93-
if *byte == b' ' {
94-
*compressed = b'&';
95-
} else {
96-
*compressed = *byte;
88+
if let Some(byte) = bytes.next() {
89+
if let Some(compressed) = compressed.next() {
90+
if byte == buffered {
91+
*compressed = b' ';
92+
} else {
93+
if *byte == b' ' {
94+
*compressed = b'&';
95+
} else {
96+
*compressed = *byte;
97+
}
98+
}
9799
}
98100
}
99101
}

src/header/parsing.rs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,11 +72,17 @@ impl Header {
7272
let mut ionex = IonexHeaderFields::default();
7373
let mut doris = DorisHeader::default();
7474

75-
for l in reader.lines() {
76-
let line = l.unwrap();
75+
for line in reader.lines() {
76+
if line.is_err() {
77+
continue;
78+
}
79+
80+
let line = line.unwrap();
81+
7782
if line.len() < 60 {
7883
continue; // --> invalid header content
7984
}
85+
8086
let (content, marker) = line.split_at(60);
8187
///////////////////////////////
8288
// [0] END OF HEADER

src/navigation/ephemeris/mod.rs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -269,8 +269,6 @@ impl Ephemeris {
269269

270270
/// Return Time of [Ephemeris] (ToE) expressed as [Epoch]
271271
pub fn toe(&self, sv: SV) -> Option<Epoch> {
272-
let timescale = sv.constellation.timescale()?;
273-
274272
// TODO: in CNAV V4 TOC is said to be TOE... ...
275273
let (week, seconds) = (self.get_week()?, self.get_orbit_f64("toe")?);
276274
let nanos = (seconds * 1.0E9).round() as u64;

src/navigation/rinex/feature.rs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ impl Rinex {
1515
/// ## Returns
1616
/// - orbital state: expressed as ECEF [Orbit]
1717
pub fn sv_orbit(&self, sv: SV, t: Epoch) -> Option<Orbit> {
18-
let (toc, _, eph) = self.nav_ephemeris_selection(sv, t)?;
18+
let (_, _, eph) = self.nav_ephemeris_selection(sv, t)?;
1919
eph.kepler2position(sv, t)
2020
}
2121

@@ -52,8 +52,6 @@ impl Rinex {
5252
/// Note that `ToE` does not exist for GEO/SBAS [SV], so `ToC` is simply
5353
/// copied in this case, to maintain the API.
5454
pub fn nav_ephemeris_selection(&self, sv: SV, t: Epoch) -> Option<(Epoch, Epoch, &Ephemeris)> {
55-
let sv_ts = sv.constellation.timescale()?;
56-
5755
if sv.constellation.is_sbas() {
5856
self.nav_ephemeris_frames_iter()
5957
.filter_map(|(k, eph)| {

src/navigation/time/parsing.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,7 @@ impl TimeOffset {
156156
let t_ref = parse_epoch_in_timescale(epoch.trim(), lhs)?;
157157
let (t_week, t_nanos) = t_ref.to_time_of_week();
158158

159-
let (t_tm, rem) = line_2.split_at(23);
159+
let (_, rem) = line_2.split_at(23);
160160
let (a0, rem) = rem.split_at(19);
161161
let (a1, rem) = rem.split_at(19);
162162
let (a2, _) = rem.split_at(19);

src/reader.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,7 @@ impl<R: Read> BufRead for Reader<R> {
6868
}
6969
Ok(&self.buf[self.rd_ptr..])
7070
}
71+
7172
fn consume(&mut self, s: usize) {
7273
let avail = 8192 - self.rd_ptr;
7374
if avail >= s {

src/record/parsing.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -332,8 +332,9 @@ impl Record {
332332
},
333333

334334
Type::AntennaData => {
335-
let (antenna, content) = parse_antex_antenna(&epoch_buf).unwrap();
336-
atx_rec.push((antenna, content));
335+
if let Ok((antenna, content)) = parse_antex_antenna(&epoch_buf) {
336+
atx_rec.push((antenna, content));
337+
}
337338
},
338339

339340
Type::IonosphereMaps => {

src/tests/crinex/decompression/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ use std::{
1919
use crate::{
2020
hatanaka::Decompressor,
2121
prelude::{Constellation, Observable},
22-
tests::toolkit::{generic_observation_comparison, random_name},
22+
tests::toolkit::generic_observation_comparison,
2323
};
2424

2525
/// This method is used by all "raw" decompression tests

0 commit comments

Comments
 (0)