use crate::de;
use serde::{Deserialize, Serialize};
use std::collections::BTreeMap as Map;
use std::fmt;
#[derive(Serialize, Deserialize, Eq, PartialEq, Debug, Clone)]
pub enum BodyType {
Star,
Planet,
PlanetaryRing,
Moon, StellarRing,
Station,
AsteroidCluster,
Null,
#[serde(untagged)]
Unknown(String),
}
impl From<&str> for BodyType {
fn from(name: &str) -> Self {
serde_json::from_value(serde_json::Value::String(name.to_owned()))
.unwrap_or_else(|_| Self::Unknown(name.to_owned()))
}
}
impl fmt::Display for BodyType {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Self::Unknown(name) => write!(f, "{}", name),
named => write!(f, "{:?}", named),
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub enum AtmosphereType {
Ammonia,
AmmoniaOxygen,
AmmoniaRich,
Argon,
ArgonRich,
CarbonDioxide,
CarbonDioxideRich,
EarthLike,
Helium,
MetallicVapour,
Methane,
MethaneRich,
Neon,
NeonRich,
Nitrogen,
Oxygen,
SilicateVapour,
SulphurDioxide,
Water,
WaterRich,
None,
#[serde(untagged)]
Unknown(String),
}
impl From<&str> for AtmosphereType {
fn from(name: &str) -> Self {
serde_json::from_value(serde_json::Value::String(name.to_owned()))
.unwrap_or_else(|_| Self::Unknown(name.to_owned()))
}
}
impl fmt::Display for AtmosphereType {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
match self {
Self::Unknown(name) => write!(f, "{}", name),
named => write!(f, "{:?}", named),
}
}
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "PascalCase")]
pub struct Surface {
pub atmosphere_type: AtmosphereType,
#[serde(rename = "SurfacePressure")]
pub pressure: f32,
pub composition: Composition,
#[serde(default)]
pub landable: bool,
#[serde(default, deserialize_with = "de::empty_str_is_none")]
pub atmosphere: Option<String>,
#[serde(default, deserialize_with = "de::empty_str_is_none")]
pub volcanism: Option<String>,
#[serde(default, deserialize_with = "de::empty_str_is_none")]
pub terraform_state: Option<String>,
#[serde(default)]
pub materials: Vec<Material>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "PascalCase")]
pub struct Orbit {
pub semi_major_axis: f32,
pub eccentricity: f32,
pub orbital_inclination: f32,
pub periapsis: f32,
pub orbital_period: f32,
#[serde(default)]
pub ascending_node: Option<f32>,
#[serde(default)]
pub mean_anomaly: Option<f32>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct Spin {
#[serde(rename = "RotationPeriod")]
pub period: f32,
#[serde(rename = "AxialTilt")]
pub tilt: f32,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct Discovery {
#[serde(rename = "WasDiscovered")]
pub discovered: bool,
#[serde(rename = "WasMapped")]
pub mapped: bool,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "PascalCase")]
pub struct Composition {
pub ice: f32,
pub rock: f32,
pub metal: f32,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(rename_all = "PascalCase")]
pub struct Material {
pub name: String,
pub percent: f64,
}
pub struct Node {
pub body_type: BodyType,
pub body_id: i16,
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(rename_all = "PascalCase")]
pub struct Body {
#[serde(rename = "BodyID")]
pub id: i16,
#[serde(rename = "BodyName")]
#[serde(alias = "Body")]
pub name: String,
#[serde(rename = "BodyType")]
pub ty: Option<BodyType>,
#[serde(rename = "DistanceFromArrivalLS")]
#[serde(alias = "DistFromStarLS")]
pub distance_from_arrival: Option<f32>,
pub parents: Vec<Map<String, i16>>,
pub planet_class: String, pub tidal_lock: Option<bool>,
#[serde(rename = "MassEM")]
pub mass: f32,
pub radius: f32,
#[serde(rename = "SurfaceGravity")]
pub gravity: f32,
#[serde(rename = "SurfaceTemperature")]
pub temperature: Option<f32>,
#[serde(flatten)]
pub surface: Option<Surface>,
#[serde(flatten)]
pub orbit: Orbit,
#[serde(flatten)]
pub spin: Spin,
#[serde(flatten)]
pub discovery: Discovery,
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(rename_all = "PascalCase")]
pub struct Signal {
#[serde(rename = "Type")]
pub ty: String,
pub count: usize,
}
#[derive(Serialize, Deserialize, Debug)]
#[serde(rename_all = "PascalCase")]
pub struct Star {
#[serde(rename = "BodyName")]
pub name: String,
#[serde(rename = "BodyID")]
pub id: i16,
#[serde(default)]
pub parents: Vec<Map<String, i16>>,
pub absolute_magnitude: f32,
#[serde(rename = "Age_MY")]
pub age_my: i32,
#[serde(rename = "DistanceFromArrivalLS")]
pub distance_from_arrival_ls: f32,
pub luminosity: String,
#[serde(rename = "StarType")]
pub star_class: String,
pub stellar_mass: f32,
pub subclass: i16,
#[serde(flatten)]
pub orbit: Option<Orbit>,
#[serde(flatten)]
pub spin: Spin,
pub radius: f32,
#[serde(rename = "SurfaceTemperature")]
pub temperature: f32,
#[serde(flatten)]
pub discovery: Discovery,
}