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;
5
6#[derive(Debug, Clone)]
7pub struct OcppApiClient {
8 client: ApiClient<Channel>,
9}
10
11impl OcppApiClient {
12 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 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}