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.into_inner().charger.map(Charger::from))
32 }
33
34 pub async fn get_charger(
36 &self,
37 charger_id: &str,
38 ) -> Result<Option<Charger>, Box<dyn std::error::Error + Send + Sync + 'static>> {
39 let mut client = self.client.clone();
40 let request = ocpp_csms_server::GetChargerRequest {
41 charger_id: charger_id.to_string(),
42 };
43
44 let response = client.get_charger(request).await?;
45
46 Ok(response.into_inner().charger.map(Charger::from))
47 }
48
49 pub async fn get_chargers(
50 &self,
51 page_size: i64,
52 page: i64,
53 ) -> Result<Vec<ChargerSummary>, Box<dyn std::error::Error + Send + Sync + 'static>> {
54 let mut client = self.client.clone();
55 let request = ocpp_csms_server::GetChargersRequest { page_size, page };
56
57 let response = client.get_chargers(request).await?;
58
59 Ok(response
60 .into_inner()
61 .chargers
62 .into_iter()
63 .map(ChargerSummary::from)
64 .collect())
65 }
66
67 pub async fn reboot_charger(
68 &self,
69 charger_id: &str,
70 reboot_type: RebootType,
71 ) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
72 let mut client = self.client.clone();
73 let request = ocpp_csms_server::RebootChargerRequest {
74 charger_id: charger_id.to_string(),
75 reboot_type: ocpp_csms_server::reboot_charger_request::RebootType::from(reboot_type)
76 .into(),
77 };
78
79 let _ = client.reboot_charger(request).await?;
80
81 Ok(())
82 }
83
84 pub async fn change_charger_availability(
85 &self,
86 charger_id: &str,
87 operative: bool,
88 ) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
89 let mut client = self.client.clone();
90 let request = ocpp_csms_server::ChangeChargerAvailabilityRequest {
91 charger_id: charger_id.to_string(),
92 operative,
93 };
94
95 let _ = client.change_charger_availability(request).await?;
96
97 Ok(())
98 }
99
100 pub async fn change_evse_availability(
101 &self,
102 charger_id: &str,
103 evse_id: &str,
104 operative: bool,
105 ) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
106 let mut client = self.client.clone();
107 let request = ocpp_csms_server::ChangeEvseAvailabilityRequest {
108 charger_id: charger_id.to_string(),
109 evse_id: evse_id.to_string(),
110 operative,
111 };
112
113 let _ = client.change_evse_availability(request).await?;
114
115 Ok(())
116 }
117
118 pub async fn change_connector_availability(
119 &self,
120 charger_id: &str,
121 evse_id: &str,
122 connector_id: &str,
123 operative: bool,
124 ) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
125 let mut client = self.client.clone();
126 let request = ocpp_csms_server::ChangeConnectorAvailabilityRequest {
127 charger_id: charger_id.to_string(),
128 evse_id: evse_id.to_string(),
129 connector_id: connector_id.to_string(),
130 operative,
131 };
132
133 let _ = client.change_connector_availability(request).await?;
134
135 Ok(())
136 }
137
138 pub async fn clear_charger_cache(
139 &self,
140 charger_id: &str,
141 ) -> Result<(), Box<dyn std::error::Error + Send + Sync + 'static>> {
142 let mut client = self.client.clone();
143 let request = ocpp_csms_server::ClearChargerCacheRequest {
144 charger_id: charger_id.to_string(),
145 };
146
147 let _ = client.clear_charger_cache(request).await?;
148
149 Ok(())
150 }
151
152 pub async fn start_transaction(
153 &self,
154 charger_id: &str,
155 evse_id: &str,
156 ) -> Result<Transaction, Box<dyn std::error::Error + Send + Sync + 'static>> {
157 let mut client = self.client.clone();
158 let request = ocpp_csms_server::StartTransactionRequest {
159 charger_id: charger_id.to_string(),
160 evse_id: evse_id.to_string(),
161 };
162
163 let response = client.start_transaction(request).await?;
164
165 match response.into_inner().transaction {
166 Some(transaction) => Ok(Transaction::try_from(transaction)?),
167 None => Err("Missing transaction".into()),
168 }
169 }
170
171 pub async fn stop_transaction(
172 &self,
173 charger_id: &str,
174 transaction_id: &str,
175 ) -> Result<Transaction, Box<dyn std::error::Error + Send + Sync + 'static>> {
176 let mut client = self.client.clone();
177 let request = ocpp_csms_server::StopTransactionRequest {
178 charger_id: charger_id.to_string(),
179 transaction_id: transaction_id.to_string(),
180 };
181
182 let response = client.stop_transaction(request).await?;
183
184 match response.into_inner().transaction {
185 Some(transaction) => Ok(Transaction::try_from(transaction)?),
186 None => Err("Missing transaction".into()),
187 }
188 }
189
190 pub async fn get_ongoing_transaction(
191 &self,
192 charger_id: &str,
193 evse_id: Uuid,
194 ) -> Result<Option<Transaction>, Box<dyn std::error::Error + Send + Sync + 'static>> {
195 let mut client = self.client.clone();
196 let request = ocpp_csms_server::GetOngoingTransactionRequest {
197 charger_id: charger_id.to_string(),
198 evse_id: evse_id.to_string(),
199 };
200
201 let response = client.get_ongoing_transaction(request).await?;
202
203 response
204 .into_inner()
205 .transaction
206 .map(Transaction::try_from)
207 .transpose()
208 }
209}