use maidenhead::{longlat_to_grid, MHError};
use serde::{Deserialize, Serialize};
use serde_with::serde_as;
use time::OffsetDateTime;
use crate::{Callsign, Summit};
#[serde_as]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Association {
pub association_code: String,
pub association_name: String,
pub manager: String,
pub association_manager_callsign: Callsign,
#[serde(with = "time::serde::rfc3339")]
pub active_from: OffsetDateTime,
pub dxcc: String,
pub max_lat: f32,
pub max_long: f32,
pub min_lat: f32,
pub min_long: f32,
pub regions_count: usize,
pub summits_count: usize,
pub regions: Vec<Region>,
pub arm: Vec<ARM>,
}
#[serde_as]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Region {
pub association_code: String,
pub region_code: String,
pub region_manager_callsign: String,
pub region_name: String,
pub manager: String,
pub summits: usize,
pub notes: String,
pub max_lat: f32,
pub max_long: f32,
pub min_lat: f32,
pub min_long: f32,
}
#[serde_as]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ARM {
pub association_code: String,
pub file_name: String,
pub language: String,
pub version_number: f32,
#[serde(with = "time::serde::rfc3339")]
pub last_updated: OffsetDateTime,
}
#[serde_as]
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub(crate) struct RegionResponse {
pub region: Region,
pub summits: Vec<Summit>,
}
pub(crate) trait HasBounds {
fn bounds(&self) -> (f32, f32, f32, f32);
fn maidenhead(&self, precision: usize) -> Result<(String, String), MHError> {
let (s, w, n, e) = self.bounds();
Ok((
longlat_to_grid(w.into(), s.into(), precision)?,
longlat_to_grid(e.into(), n.into(), precision)?,
))
}
}
impl HasBounds for Region {
fn bounds(&self) -> (f32, f32, f32, f32) {
(self.min_lat, self.min_long, self.max_lat, self.max_long)
}
}
impl HasBounds for Association {
fn bounds(&self) -> (f32, f32, f32, f32) {
(self.min_lat, self.min_long, self.max_lat, self.max_long)
}
}