ocpp_csms_server_sdk/
ocpp_api_client.rs1use crate::ocpp_csms_server;
2use crate::types::{Charger, ChargerSummary, RebootType, Transaction};
3pub use ocpp_csms_server::api_client::ApiClient;
4use tonic::transport::Channel;
5use uuid::Uuid;
6
7#[derive(Debug, Clone)]
8pub struct OcppApiClient {
9 client: ApiClient<Channel>,
10}
11
12impl OcppApiClient {
13 pub async fn connect(
15 url: &str,
16 ) -> Result<Self, Box<dyn std::error::Error + Send + Sync + 'static>> {
17 let client = ApiClient::connect(url.to_string()).await?;
18 Ok(Self { client })
19 }
20 pub async fn create_charger(
21 &self,
22 charger_id: &str,
23 ) -> Result<Option<Charger>, Box<dyn std::error::Error + Send + Sync + 'static>> {
24 let mut client = self.client.clone();
25 let request = ocpp_csms_server::CreateChargerRequest {
26 charger_id: charger_id.to_string(),
27 };
28
29 let response = client.create_charger(request).await?;
30
31 Ok(response
32 .into_inner()
33 .charger
34 .map(Charger::try_from)
35 .transpose()?)
36 }
37
38 pub async fn get_charger(
40 &self,
41 charger_id: &str,
42 ) -> Result<Option<Charger>, Box<dyn std::error::Error + Send + Sync + 'static>> {
43 let mut client = self.client.clone();
44 let request = ocpp_csms_server::GetChargerRequest {
45 charger_id: charger_id.to_string(),
46 };
47
48 let response = client.get_charger(request).await?;
49
50 Ok(response
51 .into_inner()
52 .charger
53 .map(Charger::try_from)
54 .transpose()?)
55 }
56
57 pub async fn get_chargers(
58 &self,
59 page_size: i64,
60 page: i64,
61 ) -> Result<Vec<ChargerSummary>, Box<dyn std::error::Error + Send + Sync + 'static>> {
62 let mut client = self.client.clone();
63 let request = ocpp_csms_server::GetChargersRequest { page_size, page };
64
65 let response = client.get_chargers(request).await?;
66
67 Ok(response
68 .into_inner()
69 .chargers
70 .into_iter()
71 .map(ChargerSummary::from)
72 .collect())
73 }
74
75 pub async fn reboot_charger(
76 &self,
77 charger_id: &str,
78 reboot_type: RebootType,
79 ) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
80 let mut client = self.client.clone();
81 let request = ocpp_csms_server::RebootChargerRequest {
82 charger_id: charger_id.to_string(),
83 reboot_type: ocpp_csms_server::reboot_charger_request::RebootType::from(reboot_type)
84 .into(),
85 };
86
87 let _ = client.reboot_charger(request).await?;
88
89 Ok(())
90 }
91
92 pub async fn change_charger_availability(
93 &self,
94 charger_id: &str,
95 operative: bool,
96 ) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
97 let mut client = self.client.clone();
98 let request = ocpp_csms_server::ChangeChargerAvailabilityRequest {
99 charger_id: charger_id.to_string(),
100 operative,
101 };
102
103 let _ = client.change_charger_availability(request).await?;
104
105 Ok(())
106 }
107
108 pub async fn change_evse_availability(
109 &self,
110 charger_id: &str,
111 evse_id: &str,
112 operative: bool,
113 ) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
114 let mut client = self.client.clone();
115 let request = ocpp_csms_server::ChangeEvseAvailabilityRequest {
116 charger_id: charger_id.to_string(),
117 evse_id: evse_id.to_string(),
118 operative,
119 };
120
121 let _ = client.change_evse_availability(request).await?;
122
123 Ok(())
124 }
125
126 pub async fn change_connector_availability(
127 &self,
128 charger_id: &str,
129 evse_id: &str,
130 connector_id: &str,
131 operative: bool,
132 ) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
133 let mut client = self.client.clone();
134 let request = ocpp_csms_server::ChangeConnectorAvailabilityRequest {
135 charger_id: charger_id.to_string(),
136 evse_id: evse_id.to_string(),
137 connector_id: connector_id.to_string(),
138 operative,
139 };
140
141 let _ = client.change_connector_availability(request).await?;
142
143 Ok(())
144 }
145
146 pub async fn clear_charger_cache(
147 &self,
148 charger_id: &str,
149 ) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
150 let mut client = self.client.clone();
151 let request = ocpp_csms_server::ClearChargerCacheRequest {
152 charger_id: charger_id.to_string(),
153 };
154
155 let _ = client.clear_charger_cache(request).await?;
156
157 Ok(())
158 }
159
160 pub async fn start_transaction(
161 &self,
162 charger_id: &str,
163 evse_id: &str,
164 ) -> Result<Transaction, Box<dyn std::error::Error + Send + Sync + 'static>> {
165 let mut client = self.client.clone();
166 let request = ocpp_csms_server::StartTransactionRequest {
167 charger_id: charger_id.to_string(),
168 evse_id: evse_id.to_string(),
169 };
170
171 let response = client.start_transaction(request).await?;
172
173 match response.into_inner().transaction {
174 Some(transaction) => Ok(Transaction::try_from(transaction)?),
175 None => Err("Missing transaction".into()),
176 }
177 }
178
179 pub async fn stop_transaction(
180 &self,
181 charger_id: &str,
182 transaction_id: &str,
183 ) -> Result<Transaction, Box<dyn std::error::Error + Send + Sync + 'static>> {
184 let mut client = self.client.clone();
185 let request = ocpp_csms_server::StopTransactionRequest {
186 charger_id: charger_id.to_string(),
187 transaction_id: transaction_id.to_string(),
188 };
189
190 let response = client.stop_transaction(request).await?;
191
192 match response.into_inner().transaction {
193 Some(transaction) => Ok(Transaction::try_from(transaction)?),
194 None => Err("Missing transaction".into()),
195 }
196 }
197
198 pub async fn get_ongoing_transaction(
199 &self,
200 charger_id: &str,
201 evse_id: Uuid,
202 ) -> Result<Option<Transaction>, Box<dyn std::error::Error + Send + Sync + 'static>> {
203 let mut client = self.client.clone();
204 let request = ocpp_csms_server::GetOngoingTransactionRequest {
205 charger_id: charger_id.to_string(),
206 evse_id: evse_id.to_string(),
207 };
208
209 let response = client.get_ongoing_transaction(request).await?;
210
211 response
212 .into_inner()
213 .transaction
214 .map(Transaction::try_from)
215 .transpose()
216 }
217}