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.into_inner().charger.map(Charger::from))
32    }
33
34    /// Retrieves a charger by its ID.
35    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}