use crate::prelude::*;
pub struct PlanetaryInteractionGroup<'a> {
pub(crate) esi: &'a Esi,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
#[allow(missing_docs)]
pub struct Schematic {
pub cycle_time: i64,
pub schematic_name: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum PlanetType {
Temperate,
Barren,
Oceanic,
Ice,
Gas,
Lava,
Storm,
Plasma,
#[serde(other)]
Unrecognized,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct CharacterPlanet {
pub last_update: String,
pub num_pins: i64,
pub owner_id: i64,
pub planet_id: i64,
pub planet_type: PlanetType,
pub solar_system_id: i64,
pub upgrade_level: i64,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct ColonyLink {
pub destination_pin_id: i64,
pub link_level: i64,
pub source_pin_id: i64,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct PinContent {
pub amount: i64,
pub type_id: i64,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
pub struct ExtractorHead {
pub head_id: i64,
pub latitude: f64,
pub longitude: f64,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
pub struct ExtractorDetails {
pub cycle_time: Option<i64>,
pub head_radius: Option<f64>,
#[serde(default)]
pub heads: Vec<ExtractorHead>,
pub product_type_id: Option<i64>,
pub qty_per_cycle: Option<i64>,
}
#[derive(Debug, Clone, PartialEq, Eq, Deserialize, Serialize)]
pub struct FactoryDetails {
pub schematic_id: i64,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
pub struct ColonyPin {
#[serde(default)]
pub contents: Vec<PinContent>,
pub expiry_time: Option<String>,
pub extractor_details: Option<ExtractorDetails>,
pub factory_details: Option<FactoryDetails>,
pub install_time: Option<String>,
pub last_cycle_start: Option<String>,
pub latitude: f64,
pub longitude: f64,
pub pin_id: i64,
pub schematic_id: Option<i64>,
pub type_id: i64,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
pub struct ColonyRoute {
pub content_type_id: i64,
pub destination_pin_id: i64,
pub quantity: f64,
pub route_id: i64,
pub source_pin_id: i64,
#[serde(default)]
pub waypoints: Vec<i64>,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
pub struct Colony {
pub links: Vec<ColonyLink>,
pub pins: Vec<ColonyPin>,
pub routes: Vec<ColonyRoute>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
#[serde(rename_all = "snake_case")]
pub enum StandingLevel {
Bad,
Excellent,
Good,
Neutral,
Terrible,
#[serde(other)]
Unrecognized,
}
#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)]
pub struct CustomsOffice {
pub alliance_tax_rate: Option<f64>,
pub allow_access_with_standings: bool,
pub allow_alliance_access: bool,
pub bad_standing_tax_rate: Option<f64>,
pub corporation_tax_rate: Option<f64>,
pub excellent_standing_tax_rate: Option<f64>,
pub good_standing_tax_rate: Option<f64>,
pub neutral_standing_tax_rate: Option<f64>,
pub office_id: i64,
pub reinforce_exit_end: i64,
pub reinforce_exit_start: i64,
pub standing_level: Option<StandingLevel>,
pub system_id: i64,
pub terrible_standing_tax_rate: Option<f64>,
pub type_id: Option<i64>,
}
impl PlanetaryInteractionGroup<'_> {
api_get!(
get_schematic,
"GetUniverseSchematicsSchematicId",
RequestType::Public,
Schematic,
(schematic_id: i64) => "{schematic_id}"
);
api_get!(
get_character_planets,
"GetCharactersCharacterIdPlanets",
RequestType::Authenticated,
Vec<CharacterPlanet>,
(character_id: i64) => "{character_id}"
);
api_get!(
get_character_planet,
"GetCharactersCharacterIdPlanetsPlanetId",
RequestType::Authenticated,
Colony,
(character_id: i64) => "{character_id}",
(planet_id: i64) => "{planet_id}"
);
api_get!(
get_corporation_customs_offices,
"GetCorporationsCorporationIdCustomsOffices",
RequestType::Authenticated,
Vec<CustomsOffice>,
(corporation_id: i64) => "{corporation_id}";
Optional(page: i32) => "page"
);
}
#[cfg(test)]
mod colony_tests {
use super::*;
#[test]
fn test_parse_colony() {
let json = r#"{"links": [{"destination_pin_id": 1000000000001, "link_level": 0, "source_pin_id": 2}],
"pins": [{"latitude": 1.0, "longitude": 2.0, "pin_id": 1000000000001, "type_id": 2524,
"extractor_details": {"cycle_time": 3600, "heads": [{"head_id": 0, "latitude": 1.0, "longitude": 1.0}]},
"contents": [{"amount": 3000000000, "type_id": 2268}]}],
"routes": [{"content_type_id": 2268, "destination_pin_id": 2, "quantity": 20.0,
"route_id": 1, "source_pin_id": 1}]}"#;
let c: Colony = serde_json::from_str(json).unwrap();
assert_eq!(c.pins[0].pin_id, 1_000_000_000_001);
assert_eq!(c.pins[0].contents[0].amount, 3_000_000_000);
assert!(c.routes[0].waypoints.is_empty());
assert_eq!(c.pins[0].extractor_details.as_ref().unwrap().heads.len(), 1);
}
#[test]
fn test_parse_planets_and_offices() {
let p: Vec<CharacterPlanet> = serde_json::from_str(
r#"[{"last_update": "u", "num_pins": 5, "owner_id": 2112000000, "planet_id": 40000001,
"planet_type": "lava", "solar_system_id": 30000142, "upgrade_level": 4},
{"last_update": "u", "num_pins": 1, "owner_id": 1, "planet_id": 1,
"planet_type": "shattered", "solar_system_id": 1, "upgrade_level": 0}]"#,
)
.unwrap();
assert_eq!(p[0].planet_type, PlanetType::Lava);
assert_eq!(p[1].planet_type, PlanetType::Unrecognized);
let o: Vec<CustomsOffice> = serde_json::from_str(
r#"[{"allow_access_with_standings": true, "allow_alliance_access": false,
"office_id": 1040000000000, "reinforce_exit_end": 21, "reinforce_exit_start": 20,
"system_id": 30000142, "standing_level": "good", "good_standing_tax_rate": 0.05}]"#,
)
.unwrap();
assert_eq!(o[0].standing_level, Some(StandingLevel::Good));
assert_eq!(o[0].office_id, 1_040_000_000_000);
}
}