binex/message/record/
mod.rs

1//! Record: Message content
2
3use crate::message::MessageID;
4
5mod ephemeris; // ephemeris frames
6mod monument; // geodetic marker // ephemeris frames
7mod solutions; // solutions frames
8
9pub use ephemeris::{
10    EphemerisFrame, GALEphemeris, GLOEphemeris, GPSEphemeris, GPSRaw, SBASEphemeris,
11};
12
13pub use monument::{GeoStringFrame, MonumentGeoMetadata, MonumentGeoRecord};
14
15pub use solutions::{
16    PositionEcef3d, PositionGeo3d, Solutions, SolutionsFrame, TemporalSolution, Velocity3d,
17    VelocityNED3d,
18};
19
20#[derive(Debug, Clone, PartialEq)]
21pub enum Record {
22    /// Geodetic Marker, Site and Reference point information.
23    /// Includes Geodetic metadata.
24    MonumentGeo(MonumentGeoRecord),
25    /// Ephemeris Frame
26    EphemerisFrame(EphemerisFrame),
27    /// Solutions frame
28    Solutions(Solutions),
29}
30
31impl From<MonumentGeoRecord> for Record {
32    fn from(geo: MonumentGeoRecord) -> Self {
33        Self::MonumentGeo(geo)
34    }
35}
36
37impl From<EphemerisFrame> for Record {
38    fn from(fr: EphemerisFrame) -> Self {
39        Self::EphemerisFrame(fr)
40    }
41}
42
43impl Default for Record {
44    fn default() -> Self {
45        Self::MonumentGeo(Default::default())
46    }
47}
48
49impl Record {
50    /// Builds new [MonumentGeoRecord]
51    pub fn new_monument_geo(r: MonumentGeoRecord) -> Self {
52        Self::MonumentGeo(r)
53    }
54    /// Builds new [EphemerisFrame]
55    pub fn new_ephemeris_frame(fr: EphemerisFrame) -> Self {
56        Self::EphemerisFrame(fr)
57    }
58    /// Builds new [Solutions]
59    pub fn new_solutions(sol: Solutions) -> Self {
60        Self::Solutions(sol)
61    }
62    /// [MonumentGeoRecord] unwrapping attempt
63    pub fn as_monument_geo(&self) -> Option<&MonumentGeoRecord> {
64        match self {
65            Self::MonumentGeo(r) => Some(r),
66            _ => None,
67        }
68    }
69    /// [EphemerisFrame] unwrapping attempt
70    pub fn as_ephemeris(&self) -> Option<&EphemerisFrame> {
71        match self {
72            Self::EphemerisFrame(fr) => Some(fr),
73            _ => None,
74        }
75    }
76    /// [Solutions] unwrapping attempt
77    pub fn as_solutions(&self) -> Option<&Solutions> {
78        match self {
79            Self::Solutions(sol) => Some(sol),
80            _ => None,
81        }
82    }
83    /// Returns [MessageID] to associate to [Self] in stream header.
84    pub(crate) fn to_message_id(&self) -> MessageID {
85        match self {
86            Self::EphemerisFrame(_) => MessageID::Ephemeris,
87            Self::MonumentGeo(_) => MessageID::SiteMonumentMarker,
88            Self::Solutions(_) => MessageID::ProcessedSolutions,
89        }
90    }
91
92    /// Returns internal encoding size
93    pub(crate) fn encoding_size(&self) -> usize {
94        match self {
95            Self::Solutions(sol) => sol.encoding_size(),
96            Self::EphemerisFrame(fr) => fr.encoding_size(),
97            Self::MonumentGeo(geo) => geo.encoding_size(),
98        }
99    }
100}