freedom_api/api/post/
satellite.rs

1use serde::Serialize;
2
3use crate::{api::Api, error::Error};
4
5use super::{Post, UrlResult};
6
7#[derive(Debug, Clone, PartialEq, Serialize)]
8#[serde(rename_all = "camelCase")]
9struct SatelliteInner {
10    name: String,
11    description: Option<String>,
12    norad_cat_id: u32,
13    configuration: String,
14}
15
16#[derive(Debug, Clone, PartialEq)]
17pub struct Satellite {
18    name: String,
19    description: Option<String>,
20    norad_cat_id: u32,
21    configuration: UrlResult,
22}
23
24pub fn new<C>(client: &C) -> SatelliteBuilder<'_, C, NoName> {
25    SatelliteBuilder {
26        client,
27        state: NoName,
28    }
29}
30
31pub struct SatelliteBuilder<'a, C, S> {
32    pub(crate) client: &'a C,
33    state: S,
34}
35
36pub struct NoName;
37
38impl<'a, C> SatelliteBuilder<'a, C, NoName> {
39    pub fn name(self, name: impl Into<String>) -> SatelliteBuilder<'a, C, NoConfig> {
40        SatelliteBuilder {
41            client: self.client,
42            state: NoConfig { name: name.into() },
43        }
44    }
45}
46
47pub struct NoConfig {
48    name: String,
49}
50
51impl<'a, C> SatelliteBuilder<'a, C, NoConfig> {
52    fn satellite_configuration_result(self, url: UrlResult) -> SatelliteBuilder<'a, C, NoNorad> {
53        SatelliteBuilder {
54            client: self.client,
55            state: NoNorad {
56                name: self.state.name,
57                configuration: url,
58            },
59        }
60    }
61
62    pub fn satellite_configuration_url(
63        self,
64        url: impl Into<String>,
65    ) -> SatelliteBuilder<'a, C, NoNorad> {
66        self.satellite_configuration_result(UrlResult::Checked(url.into()))
67    }
68}
69
70impl<'a, C> SatelliteBuilder<'a, C, NoConfig>
71where
72    C: Api,
73{
74    pub fn satellite_configuration_id(
75        self,
76        id: impl Into<i32>,
77    ) -> SatelliteBuilder<'a, C, NoNorad> {
78        let configuration = self
79            .client
80            .path_to_url(format!("satellite_configurations/{}", id.into()));
81
82        self.satellite_configuration_result(UrlResult::Unchecked(configuration))
83    }
84}
85
86pub struct NoNorad {
87    name: String,
88    configuration: UrlResult,
89}
90
91impl<'a, C> SatelliteBuilder<'a, C, NoNorad> {
92    pub fn norad_id(self, norad_id: u32) -> SatelliteBuilder<'a, C, Satellite> {
93        let state = Satellite {
94            name: self.state.name,
95            description: None,
96            norad_cat_id: norad_id,
97            configuration: self.state.configuration,
98        };
99
100        SatelliteBuilder {
101            client: self.client,
102            state,
103        }
104    }
105}
106
107impl<C> SatelliteBuilder<'_, C, Satellite> {
108    pub fn description(mut self, description: impl Into<String>) -> Self {
109        self.state.description = Some(description.into());
110        self
111    }
112}
113
114impl<C> Post for SatelliteBuilder<'_, C, Satellite>
115where
116    C: Api,
117{
118    type Response = freedom_models::satellite::Satellite;
119
120    async fn send(self) -> Result<Self::Response, Error> {
121        let client = self.client;
122
123        let url = client.path_to_url("satellites")?;
124        let dto = SatelliteInner {
125            name: self.state.name,
126            description: self.state.description,
127            norad_cat_id: self.state.norad_cat_id,
128            configuration: self.state.configuration.try_convert()?,
129        };
130
131        client.post_json_map(url, dto).await
132    }
133}