freedom_api/api/post/
satellite.rs1use 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}