use std::fmt::Debug;
#[cfg(feature = "serde")]
use serde::{Deserialize, Serialize};
#[cfg(feature = "uom")]
use uom::si::{f32::Length, length::meter};
#[derive(Clone, PartialEq)]
#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
pub struct Site {
identifier: [u8; 4],
latitude: f32,
longitude: f32,
height_meters: i16,
feedhorn_height_meters: u16,
}
impl Site {
pub fn new(
identifier: [u8; 4],
latitude: f32,
longitude: f32,
height_meters: i16,
feedhorn_height_meters: u16,
) -> Self {
Self {
identifier,
latitude,
longitude,
height_meters,
feedhorn_height_meters,
}
}
pub fn identifier(&self) -> &[u8; 4] {
&self.identifier
}
pub fn identifier_string(&self) -> String {
String::from_utf8_lossy(&self.identifier).to_string()
}
pub fn latitude(&self) -> f32 {
self.latitude
}
pub fn longitude(&self) -> f32 {
self.longitude
}
pub fn height_meters(&self) -> i16 {
self.height_meters
}
#[cfg(feature = "uom")]
pub fn height(&self) -> Length {
Length::new::<meter>(self.height_meters as f32)
}
pub fn feedhorn_height_meters(&self) -> u16 {
self.feedhorn_height_meters
}
#[cfg(feature = "uom")]
pub fn feedhorn_height(&self) -> Length {
Length::new::<meter>(self.feedhorn_height_meters as f32)
}
}
impl Debug for Site {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
let mut debug = f.debug_struct("Site");
debug.field("identifier", &self.identifier_string());
debug.field("latitude_degrees", &self.latitude());
debug.field("longitude_degrees", &self.longitude());
debug.field("height_meters", &self.height_meters());
#[cfg(feature = "uom")]
debug.field("height", &self.height());
debug.field("feedhorn_height_meters", &self.feedhorn_height_meters());
#[cfg(feature = "uom")]
debug.field("feedhorn_height", &self.feedhorn_height());
debug.finish()
}
}