Skip to main content

esi_openapi/groups/
routes.rs

1use crate::prelude::*;
2
3/// Endpoints for Routes
4pub struct RoutesGroup<'a> {
5    pub(crate) esi: &'a Esi,
6}
7
8/// Which route to prefer when several are possible.
9#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
10pub enum RoutePreference {
11    /// The shortest route.
12    Shorter,
13    /// The route that avoids low and null security systems.
14    Safer,
15    /// The route that prefers low and null security systems.
16    LessSecure,
17}
18
19/// An extra connection between two systems (such as a wormhole or a jump bridge).
20#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize)]
21pub struct RouteConnection {
22    /// Solar system ID the connection starts at.
23    pub from: i64,
24    /// Solar system ID the connection ends at.
25    pub to: i64,
26}
27
28/// Options for a route calculation. All fields are optional.
29#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize)]
30pub struct RouteRequest {
31    /// Solar system IDs to avoid.
32    #[serde(skip_serializing_if = "Option::is_none")]
33    pub avoid_systems: Option<Vec<i64>>,
34    /// Extra connections to consider.
35    #[serde(skip_serializing_if = "Option::is_none")]
36    pub connections: Option<Vec<RouteConnection>>,
37    /// Route preference.
38    #[serde(skip_serializing_if = "Option::is_none")]
39    pub preference: Option<RoutePreference>,
40    /// Extra penalty applied to low and null security systems.
41    #[serde(skip_serializing_if = "Option::is_none")]
42    pub security_penalty: Option<i64>,
43}
44
45/// A calculated route.
46#[derive(Debug, Clone, PartialEq, Eq, Deserialize)]
47pub struct Route {
48    /// Solar system IDs along the route, origin first.
49    pub route: Vec<i64>,
50}
51
52impl RoutesGroup<'_> {
53    api_post!(
54        /// Calculate the route between two solar systems.
55        calculate_route,
56        "PostRoute",
57        RequestType::Public,
58        Route,
59        (origin_system_id: i64) => "{origin_system_id}",
60        (destination_system_id: i64) => "{destination_system_id}",
61        options: &RouteRequest,
62    );
63}
64
65#[cfg(test)]
66mod tests {
67    use super::{RouteConnection, RoutePreference, RouteRequest};
68
69    #[test]
70    fn test_default_request_serializes_to_empty_object() {
71        let json = serde_json::to_string(&RouteRequest::default()).unwrap();
72        assert_eq!(json, "{}");
73    }
74
75    #[test]
76    fn test_request_serialization() {
77        let request = RouteRequest {
78            avoid_systems: Some(vec![30000142]),
79            connections: Some(vec![RouteConnection { from: 1, to: 2 }]),
80            preference: Some(RoutePreference::LessSecure),
81            security_penalty: Some(50),
82        };
83        let value = serde_json::to_value(&request).unwrap();
84        assert_eq!(value["preference"], "LessSecure");
85        assert_eq!(value["connections"][0]["from"], 1);
86        assert_eq!(value["security_penalty"], 50);
87    }
88}