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