ocpp_csms_server_sdk/
ocpp_api_client.rs

1use 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    /// Creates a new instance of the OcppApiClient.
14    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    /// Retrieves a charger by its ID.
39    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}