freedom_api/api/post/
satellite.rs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
use reqwest::Response;
use serde::Serialize;

use crate::{api::Api, error::Error};

#[derive(Debug, Clone, PartialEq, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Satellite {
    name: String,
    description: Option<String>,
    norad_cat_id: u32,
    configuration: String,
}

pub fn new<C>(client: &C) -> SatelliteBuilder<'_, C, NoName> {
    SatelliteBuilder {
        client,
        state: NoName,
    }
}

pub struct SatelliteBuilder<'a, C, S> {
    pub(crate) client: &'a C,
    state: S,
}

pub struct NoName;

impl<'a, C> SatelliteBuilder<'a, C, NoName> {
    pub fn name(self, name: impl Into<String>) -> SatelliteBuilder<'a, C, NoConfig> {
        SatelliteBuilder {
            client: self.client,
            state: NoConfig { name: name.into() },
        }
    }
}

pub struct NoConfig {
    name: String,
}

impl<'a, C> SatelliteBuilder<'a, C, NoConfig> {
    pub fn satellite_configuration_url(
        self,
        url: impl Into<String>,
    ) -> SatelliteBuilder<'a, C, NoNorad> {
        SatelliteBuilder {
            client: self.client,
            state: NoNorad {
                name: self.state.name,
                configuration: url.into(),
            },
        }
    }
}

impl<'a, C> SatelliteBuilder<'a, C, NoConfig>
where
    C: Api,
{
    pub fn satellite_configuration_id(
        self,
        id: impl Into<i32>,
    ) -> SatelliteBuilder<'a, C, NoNorad> {
        let configuration = self
            .client
            .path_to_url(format!("satellite_configurations/{}", id.into()))
            .to_string();

        self.satellite_configuration_url(configuration)
    }
}

pub struct NoNorad {
    name: String,
    configuration: String,
}

impl<'a, C> SatelliteBuilder<'a, C, NoNorad> {
    pub fn norad_id(self, norad_id: u32) -> SatelliteBuilder<'a, C, Satellite> {
        let state = Satellite {
            name: self.state.name,
            description: None,
            norad_cat_id: norad_id,
            configuration: self.state.configuration,
        };

        SatelliteBuilder {
            client: self.client,
            state,
        }
    }
}

impl<'a, C> SatelliteBuilder<'a, C, Satellite> {
    pub fn description(mut self, description: impl Into<String>) -> Self {
        self.state.description = Some(description.into());
        self
    }
}

impl<'a, C> SatelliteBuilder<'a, C, Satellite>
where
    C: Api,
{
    pub async fn send(self) -> Result<Response, Error> {
        let client = self.client;

        let url = client.path_to_url("satellites");
        client.post(url, self.state).await
    }
}