1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95
#![deny(missing_docs)]
//! # METAR parsing library for Rust
//!
//! ## Quick usage
//!
//! This simple usage will print out the parsed data from the METAR.
//!
//! ```rust
//! use metar::Metar;
//!
//! let metar = "EGHI 282120Z 19015KT 140V220 6000 RA SCT006 BKN009 16/14 Q1006";
//! let r = Metar::parse(metar).unwrap();
//! println!("{:#?}", r);
//! ```
//!
//! ## Issues
//!
//! METARs are complicated structures. If you come across a METAR that doesn't parse
//! correctly, please open an issue and include the METAR. This will aid in debugging
//! the issue significantly.
mod parser;
mod types;
use std::fmt;
pub use types::*;
#[derive(PartialEq, Clone, Debug)]
/// A complete METAR
pub struct Metar {
/// The station making the METAR measurement
pub station: String,
/// The measurement time
pub time: Time,
/// The current wind information
pub wind: Wind,
/// The current visibility
pub visibility: Data<Visibility>,
/// The current clouds
pub clouds: Data<Clouds>,
/// The current clouds
pub cloud_layers: Vec<CloudLayer>,
/// The current vertical visibility, in feet
pub vert_visibility: Option<VertVisibility>,
/// The current weather conditions
pub weather: Vec<Weather>,
/// The current temperature
pub temperature: Data<i32>,
/// The current dewpoint
pub dewpoint: Data<i32>,
/// The current air pressure
pub pressure: Data<Pressure>,
/// Remarks added on to the METAR
pub remarks: Option<String>,
}
#[derive(PartialEq, Eq, Clone, Debug)]
/// An error when parsing a METAR
pub struct MetarError {
/// The string being parsed
pub string: String,
/// The start index of the error
pub start: usize,
/// The length of the error'd section
pub length: usize,
/// The kind of error that occurred
pub variant: pest::error::ErrorVariant<parser::Rule>,
}
impl std::error::Error for MetarError {}
impl fmt::Display for MetarError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let mut caret = String::new();
for _ in 0..self.start {
caret.push(' ');
}
caret.push('^');
for _ in 1..self.length {
caret.push('~');
}
writeln!(f, "{}\n{}\n{:?}", self.string, caret, self.variant)
}
}
impl Metar {
/// Parse a string into a METAR
pub fn parse<S>(data: S) -> Result<Self, MetarError>
where
S: Into<String>,
{
parser::parse(data.into())
}
}