freedom_api/api/post/
overrides.rs

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