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