1use serde::{Serialize, Deserialize};
15
16#[derive(Serialize, Deserialize)]
17pub struct V230 {
18 active_charging_profile: Option<ActiveChargingProfile>,
19
20 active_charging_profile_result: Option<ActiveChargingProfileResult>,
21
22 authorization_info: Option<AuthorizationInfo>,
23
24 cancel_reservation: Option<CancelReservation>,
25
26 cdr: Option<Cdr>,
27
28 charging_preferences: Option<ChargingPreferences>,
29
30 charging_profile: Option<ChargingProfile>,
31
32 charging_profile_response: Option<ChargingProfileResponse>,
33
34 charging_profile_result: Option<ChargingProfileResult>,
35
36 clear_profile_result: Option<ClearProfileResult>,
37
38 command_response: Option<CommandResponse>,
39
40 command_result: Option<CommandResult>,
41
42 connector: Option<Connector>,
43
44 credentials: Option<Credentials>,
45
46 endpoint: Option<Endpoint>,
47
48 evse: Option<Evse>,
49
50 hub_client_info: Option<HubClientInfo>,
51
52 location: Option<Location>,
53
54 location_references: Option<LocationReferences>,
55
56 reserve_now: Option<ReserveNow>,
57
58 session: Option<Session>,
59
60 set_charging_profile: Option<SetChargingProfile>,
61
62 start_session: Option<StartSession>,
63
64 stop_session: Option<StopSession>,
65
66 tariff: Option<Tariff>,
67
68 token: Option<Token>,
69
70 unlock_connector: Option<UnlockConnector>,
71
72 version: Option<Version>,
73
74 version_details: Option<VersionDetails>,
75}
76
77#[derive(Serialize, Deserialize)]
78pub struct ActiveChargingProfile {
79 charging_profile: ChargingProfile,
80
81 start_date_time: String,
82}
83
84#[derive(Serialize, Deserialize)]
85pub struct ChargingProfile {
86 charging_profile_period: Option<Vec<ChargingProfilePeriod>>,
87
88 charging_rate_unit: ChargingRateUnit,
89
90 duration: Option<i64>,
91
92 min_charging_rate: Option<f64>,
93
94 start_date_time: Option<String>,
95}
96
97#[derive(Serialize, Deserialize)]
98pub struct ChargingProfilePeriod {
99 limit: f64,
100
101 start_period: i64,
102}
103
104#[derive(Serialize, Deserialize)]
105pub enum ChargingRateUnit {
106 A,
107
108 W,
109}
110
111#[derive(Serialize, Deserialize)]
112pub struct ActiveChargingProfileResult {
113 profile: Option<ActiveChargingProfile>,
114
115 result: ChargingProfileResultType,
116}
117
118#[derive(Serialize, Deserialize)]
119pub enum ChargingProfileResultType {
120 #[serde(rename = "ACCEPTED")]
121 Accepted,
122
123 #[serde(rename = "REJECTED")]
124 Rejected,
125
126 #[serde(rename = "UNKNOWN")]
127 Unknown,
128}
129
130#[derive(Serialize, Deserialize)]
131pub struct AuthorizationInfo {
132 allowed: AllowedType,
133
134 authorization_reference: Option<String>,
135
136 info: Option<DisplayText>,
137
138 location: Option<LocationReferences>,
139
140 token: Token,
141}
142
143#[derive(Serialize, Deserialize)]
144#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
145pub enum AllowedType {
146 Allowed,
147
148 Blocked,
149
150 Expired,
151
152 #[serde(rename = "NO_CREDIT")]
153 NoCredit,
154
155 #[serde(rename = "NOT_ALLOWED")]
156 NotAllowed,
157}
158
159#[derive(Serialize, Deserialize)]
160pub struct DisplayText {
161 language: String,
162
163 text: String,
164}
165
166#[derive(Serialize, Deserialize)]
167pub struct LocationReferences {
168 evse_uids: Option<Vec<String>>,
169
170 location_id: String,
171}
172
173#[derive(Serialize, Deserialize)]
174pub struct Token {
175 contract_id: String,
176
177 country_code: String,
178
179 default_profile_type: Option<ProfileType>,
180
181 energy_contract: Option<EnergyContract>,
182
183 group_id: Option<String>,
184
185 issuer: String,
186
187 language: Option<String>,
188
189 last_updated: String,
190
191 party_id: String,
192
193 #[serde(rename = "type")]
194 token_type: TokenType,
195
196 uid: String,
197
198 valid: bool,
199
200 visual_number: Option<String>,
201
202 whitelist: WhitelistType,
203}
204
205#[derive(Serialize, Deserialize)]
206pub enum ProfileType {
207 #[serde(rename = "CHEAP")]
208 Cheap,
209
210 #[serde(rename = "FAST")]
211 Fast,
212
213 #[serde(rename = "GREEN")]
214 Green,
215
216 #[serde(rename = "REGULAR")]
217 Regular,
218}
219
220#[derive(Serialize, Deserialize)]
221pub struct EnergyContract {
222 contract_id: Option<String>,
223
224 supplier_name: String,
225}
226
227#[derive(Serialize, Deserialize)]
228#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
229pub enum TokenType {
230 #[serde(rename = "AD_HOC_USER")]
231 AdHocUser,
232
233 #[serde(rename = "APP_USER")]
234 AppUser,
235
236 Emaid,
237
238 Other,
239
240 Rfid,
241}
242
243#[derive(Serialize, Deserialize)]
244#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
245pub enum WhitelistType {
246 Allowed,
247
248 #[serde(rename = "ALLOWED_OFFLINE")]
249 AllowedOffline,
250
251 Always,
252
253 Never,
254}
255
256#[derive(Serialize, Deserialize)]
257pub struct CancelReservation {
258 reservation_id: String,
259
260 response_url: String,
261}
262
263#[derive(Serialize, Deserialize)]
264pub struct Cdr {
265 auth_method: AuthMethod,
266
267 authorization_reference: Option<String>,
268
269 cdr_location: CdrLocation,
270
271 cdr_token: CdrToken,
272
273 charging_periods: Vec<ChargingPeriod>,
274
275 country_code: String,
276
277 credit: Option<bool>,
278
279 credit_reference_id: Option<String>,
280
281 currency: String,
282
283 end_date_time: String,
284
285 home_charging_compensation: Option<bool>,
286
287 id: String,
288
289 invoice_reference_id: Option<String>,
290
291 last_updated: String,
292
293 meter_id: Option<String>,
294
295 party_id: String,
296
297 remark: Option<String>,
298
299 session_id: Option<String>,
300
301 signed_data: Option<SignedData>,
302
303 start_date_time: String,
304
305 tariffs: Option<Vec<Tariff>>,
306
307 total_cost: Price,
308
309 total_energy: f64,
310
311 total_energy_cost: Option<Price>,
312
313 total_fixed_cost: Option<Price>,
314
315 total_parking_cost: Option<Price>,
316
317 total_parking_time: Option<f64>,
318
319 total_reservation_cost: Option<Price>,
320
321 total_time: f64,
322
323 total_time_cost: Option<Price>,
324}
325
326#[derive(Serialize, Deserialize)]
327#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
328pub enum AuthMethod {
329 #[serde(rename = "AUTH_REQUEST")]
330 AuthRequest,
331
332 Command,
333
334 Whitelist,
335}
336
337#[derive(Serialize, Deserialize)]
338pub struct CdrLocation {
339 address: String,
340
341 city: String,
342
343 connector_format: ConnectorFormat,
344
345 connector_id: String,
346
347 connector_power_type: PowerType,
348
349 connector_standard: ConnectorType,
350
351 coordinates: GeoLocation,
352
353 country: String,
354
355 evse_id: String,
356
357 evse_uid: String,
358
359 id: String,
360
361 name: Option<String>,
362
363 postal_code: Option<String>,
364
365 state: Option<String>,
366}
367
368#[derive(Serialize, Deserialize)]
369pub enum ConnectorFormat {
370 #[serde(rename = "CABLE")]
371 Cable,
372
373 #[serde(rename = "SOCKET")]
374 Socket,
375}
376
377#[derive(Serialize, Deserialize)]
378#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
379pub enum PowerType {
380 #[serde(rename = "AC_1_PHASE")]
381 Ac1_Phase,
382
383 #[serde(rename = "AC_2_PHASE")]
384 Ac2_Phase,
385
386 #[serde(rename = "AC_2_PHASE_SPLIT")]
387 Ac2_PhaseSplit,
388
389 #[serde(rename = "AC_3_PHASE")]
390 Ac3_Phase,
391
392 Dc,
393}
394
395#[derive(Serialize, Deserialize)]
396#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
397pub enum ConnectorType {
398 Chademo,
399
400 Chaoji,
401
402 #[serde(rename = "DOMESTIC_A")]
403 DomesticA,
404
405 #[serde(rename = "DOMESTIC_B")]
406 DomesticB,
407
408 #[serde(rename = "DOMESTIC_C")]
409 DomesticC,
410
411 #[serde(rename = "DOMESTIC_D")]
412 DomesticD,
413
414 #[serde(rename = "DOMESTIC_E")]
415 DomesticE,
416
417 #[serde(rename = "DOMESTIC_F")]
418 DomesticF,
419
420 #[serde(rename = "DOMESTIC_G")]
421 DomesticG,
422
423 #[serde(rename = "DOMESTIC_H")]
424 DomesticH,
425
426 #[serde(rename = "DOMESTIC_I")]
427 DomesticI,
428
429 #[serde(rename = "DOMESTIC_J")]
430 DomesticJ,
431
432 #[serde(rename = "DOMESTIC_K")]
433 DomesticK,
434
435 #[serde(rename = "DOMESTIC_L")]
436 DomesticL,
437
438 #[serde(rename = "DOMESTIC_M")]
439 DomesticM,
440
441 #[serde(rename = "DOMESTIC_N")]
442 DomesticN,
443
444 #[serde(rename = "DOMESTIC_O")]
445 DomesticO,
446
447 #[serde(rename = "GBT_AC")]
448 GbtAc,
449
450 #[serde(rename = "GBT_DC")]
451 GbtDc,
452
453 #[serde(rename = "IEC_60309_2_single_16")]
454 Iec60309_2_Single16,
455
456 #[serde(rename = "IEC_60309_2_three_16")]
457 Iec60309_2_Three16,
458
459 #[serde(rename = "IEC_60309_2_three_32")]
460 Iec60309_2_Three32,
461
462 #[serde(rename = "IEC_60309_2_three_64")]
463 Iec60309_2_Three64,
464
465 #[serde(rename = "IEC_62196_T1")]
466 Iec62196_T1,
467
468 #[serde(rename = "IEC_62196_T1_COMBO")]
469 Iec62196_T1Combo,
470
471 #[serde(rename = "IEC_62196_T2")]
472 Iec62196_T2,
473
474 #[serde(rename = "IEC_62196_T2_COMBO")]
475 Iec62196_T2Combo,
476
477 #[serde(rename = "IEC_62196_T3A")]
478 Iec62196_T3A,
479
480 #[serde(rename = "IEC_62196_T3C")]
481 Iec62196_T3C,
482
483 Mcs,
484
485 #[serde(rename = "NEMA_10_30")]
486 Nema10_30,
487
488 #[serde(rename = "NEMA_10_50")]
489 Nema10_50,
490
491 #[serde(rename = "NEMA_14_30")]
492 Nema14_30,
493
494 #[serde(rename = "NEMA_14_50")]
495 Nema14_50,
496
497 #[serde(rename = "NEMA_5_20")]
498 Nema5_20,
499
500 #[serde(rename = "NEMA_6_30")]
501 Nema6_30,
502
503 #[serde(rename = "NEMA_6_50")]
504 Nema6_50,
505
506 #[serde(rename = "PANTOGRAPH_BOTTOM_UP")]
507 PantographBottomUp,
508
509 #[serde(rename = "PANTOGRAPH_TOP_DOWN")]
510 PantographTopDown,
511
512 #[serde(rename = "SAE_J3400")]
513 SaeJ3400,
514
515 #[serde(rename = "TESLA_R")]
516 TeslaR,
517
518 #[serde(rename = "TESLA_S")]
519 TeslaS,
520}
521
522#[derive(Serialize, Deserialize)]
523pub struct GeoLocation {
524 latitude: String,
525
526 longitude: String,
527}
528
529#[derive(Serialize, Deserialize)]
530pub struct CdrToken {
531 contract_id: String,
532
533 country_code: String,
534
535 party_id: String,
536
537 #[serde(rename = "type")]
538 cdr_token_type: TokenType,
539
540 uid: String,
541}
542
543#[derive(Serialize, Deserialize)]
544pub struct ChargingPeriod {
545 dimensions: Vec<CdrDimension>,
546
547 start_date_time: String,
548
549 tariff_id: Option<String>,
550}
551
552#[derive(Serialize, Deserialize)]
553pub struct CdrDimension {
554 #[serde(rename = "type")]
555 cdr_dimension_type: CdrDimensionType,
556
557 volume: f64,
558}
559
560#[derive(Serialize, Deserialize)]
561#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
562pub enum CdrDimensionType {
563 Current,
564
565 Energy,
566
567 #[serde(rename = "ENERGY_EXPORT")]
568 EnergyExport,
569
570 #[serde(rename = "ENERGY_IMPORT")]
571 EnergyImport,
572
573 #[serde(rename = "MAX_CURRENT")]
574 MaxCurrent,
575
576 #[serde(rename = "MAX_POWER")]
577 MaxPower,
578
579 #[serde(rename = "MIN_CURRENT")]
580 MinCurrent,
581
582 #[serde(rename = "MIN_POWER")]
583 MinPower,
584
585 #[serde(rename = "PARKING_TIME")]
586 ParkingTime,
587
588 Power,
589
590 #[serde(rename = "RESERVATION_TIME")]
591 ReservationTime,
592
593 #[serde(rename = "STATE_OF_CHARGE")]
594 StateOfCharge,
595
596 Time,
597}
598
599#[derive(Serialize, Deserialize)]
600pub struct SignedData {
601 encoding_method: String,
602
603 encoding_method_version: Option<i64>,
604
605 public_key: Option<String>,
606
607 signed_values: Vec<SignedValue>,
608
609 url: Option<String>,
610}
611
612#[derive(Serialize, Deserialize)]
613pub struct SignedValue {
614 nature: String,
615
616 plain_data: String,
617
618 signed_data: String,
619}
620
621#[derive(Serialize, Deserialize)]
622pub struct Tariff {
623 country_code: String,
624
625 currency: String,
626
627 elements: Vec<TariffElement>,
628
629 end_date_time: Option<String>,
630
631 energy_mix: Option<EnergyMix>,
632
633 id: String,
634
635 last_updated: String,
636
637 max_price: Option<PriceLimit>,
638
639 min_price: Option<PriceLimit>,
640
641 party_id: String,
642
643 start_date_time: Option<String>,
644
645 tariff_alt_text: Option<Vec<DisplayText>>,
646
647 tariff_alt_url: Option<String>,
648
649 tax_included: TaxIncluded,
650
651 #[serde(rename = "type")]
652 tariff_type: Option<TariffType>,
653}
654
655#[derive(Serialize, Deserialize)]
656pub struct TariffElement {
657 price_components: Vec<PriceComponent>,
658
659 restrictions: Option<TariffRestrictions>,
660}
661
662#[derive(Serialize, Deserialize)]
663pub struct PriceComponent {
664 price: f64,
665
666 step_size: i64,
667
668 #[serde(rename = "type")]
669 price_component_type: TariffDimensionType,
670
671 vat: Option<f64>,
672}
673
674#[derive(Serialize, Deserialize)]
675#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
676pub enum TariffDimensionType {
677 Energy,
678
679 Flat,
680
681 #[serde(rename = "PARKING_TIME")]
682 ParkingTime,
683
684 Time,
685}
686
687#[derive(Serialize, Deserialize)]
688pub struct TariffRestrictions {
689 day_of_week: Option<Vec<DayOfWeek>>,
690
691 end_date: Option<String>,
692
693 end_time: Option<String>,
694
695 max_current: Option<f64>,
696
697 max_duration: Option<i64>,
698
699 max_kwh: Option<f64>,
700
701 max_power: Option<f64>,
702
703 min_current: Option<f64>,
704
705 min_duration: Option<i64>,
706
707 min_kwh: Option<f64>,
708
709 min_power: Option<f64>,
710
711 reservation: Option<ReservationRestrictionType>,
712
713 start_date: Option<String>,
714
715 start_time: Option<String>,
716}
717
718#[derive(Serialize, Deserialize)]
719pub enum DayOfWeek {
720 #[serde(rename = "FRIDAY")]
721 Friday,
722
723 #[serde(rename = "MONDAY")]
724 Monday,
725
726 #[serde(rename = "SATURDAY")]
727 Saturday,
728
729 #[serde(rename = "SUNDAY")]
730 Sunday,
731
732 #[serde(rename = "THURSDAY")]
733 Thursday,
734
735 #[serde(rename = "TUESDAY")]
736 Tuesday,
737
738 #[serde(rename = "WEDNESDAY")]
739 Wednesday,
740}
741
742#[derive(Serialize, Deserialize)]
743#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
744pub enum ReservationRestrictionType {
745 Reservation,
746
747 #[serde(rename = "RESERVATION_EXPIRES")]
748 ReservationExpires,
749}
750
751#[derive(Serialize, Deserialize)]
752pub struct EnergyMix {
753 energy_product_name: Option<String>,
754
755 energy_sources: Option<Vec<EnergySource>>,
756
757 environ_impact: Option<Vec<EnvironmentalImpact>>,
758
759 is_green_energy: bool,
760
761 supplier_name: Option<String>,
762}
763
764#[derive(Serialize, Deserialize)]
765pub struct EnergySource {
766 percentage: f64,
767
768 source: EnergySourceCategory,
769}
770
771#[derive(Serialize, Deserialize)]
772#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
773pub enum EnergySourceCategory {
774 Coal,
775
776 Gas,
777
778 #[serde(rename = "GENERAL_FOSSIL")]
779 GeneralFossil,
780
781 #[serde(rename = "GENERAL_GREEN")]
782 GeneralGreen,
783
784 Nuclear,
785
786 Solar,
787
788 Water,
789
790 Wind,
791}
792
793#[derive(Serialize, Deserialize)]
794pub struct EnvironmentalImpact {
795 amount: f64,
796
797 category: EnvironmentalImpactCategory,
798}
799
800#[derive(Serialize, Deserialize)]
801#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
802pub enum EnvironmentalImpactCategory {
803 #[serde(rename = "CARBON_DIOXIDE")]
804 CarbonDioxide,
805
806 #[serde(rename = "NUCLEAR_WASTE")]
807 NuclearWaste,
808}
809
810#[derive(Serialize, Deserialize)]
811pub struct PriceLimit {
812 after_taxes: Option<f64>,
813
814 before_taxes: f64,
815}
816
817#[derive(Serialize, Deserialize)]
818#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
819pub enum TariffType {
820 #[serde(rename = "AD_HOC_PAYMENT")]
821 AdHocPayment,
822
823 #[serde(rename = "PROFILE_CHEAP")]
824 ProfileCheap,
825
826 #[serde(rename = "PROFILE_FAST")]
827 ProfileFast,
828
829 #[serde(rename = "PROFILE_GREEN")]
830 ProfileGreen,
831
832 Regular,
833}
834
835#[derive(Serialize, Deserialize)]
836pub enum TaxIncluded {
837 #[serde(rename = "N/A")]
838 NA,
839
840 #[serde(rename = "NO")]
841 No,
842
843 #[serde(rename = "YES")]
844 Yes,
845}
846
847#[derive(Serialize, Deserialize)]
848pub struct Price {
849 before_taxes: f64,
850
851 taxes: Option<Vec<TaxAmount>>,
852}
853
854#[derive(Serialize, Deserialize)]
855pub struct TaxAmount {
856 account_number: Option<String>,
857
858 amount: f64,
859
860 name: String,
861
862 percentage: Option<f64>,
863}
864
865#[derive(Serialize, Deserialize)]
866pub struct ChargingPreferences {
867 departure_time: Option<String>,
868
869 discharge_allowed: Option<bool>,
870
871 energy_need: Option<f64>,
872
873 profile_type: ProfileType,
874}
875
876#[derive(Serialize, Deserialize)]
877pub struct ChargingProfileResponse {
878 result: ChargingProfileResponseType,
879
880 timeout: i64,
881}
882
883#[derive(Serialize, Deserialize)]
884#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
885pub enum ChargingProfileResponseType {
886 Accepted,
887
888 #[serde(rename = "NOT_SUPPORTED")]
889 NotSupported,
890
891 Rejected,
892
893 #[serde(rename = "TOO_OFTEN")]
894 TooOften,
895
896 #[serde(rename = "UNKNOWN_SESSION")]
897 UnknownSession,
898}
899
900#[derive(Serialize, Deserialize)]
901pub struct ChargingProfileResult {
902 result: ChargingProfileResultType,
903}
904
905#[derive(Serialize, Deserialize)]
906pub struct ClearProfileResult {
907 result: ChargingProfileResultType,
908}
909
910#[derive(Serialize, Deserialize)]
911pub struct CommandResponse {
912 message: Option<Vec<DisplayText>>,
913
914 result: CommandResponseType,
915
916 timeout: i64,
917}
918
919#[derive(Serialize, Deserialize)]
920#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
921pub enum CommandResponseType {
922 Accepted,
923
924 #[serde(rename = "NOT_SUPPORTED")]
925 NotSupported,
926
927 Rejected,
928
929 #[serde(rename = "UNKNOWN_SESSION")]
930 UnknownSession,
931}
932
933#[derive(Serialize, Deserialize)]
934pub struct CommandResult {
935 message: Option<Vec<DisplayText>>,
936
937 result: CommandResultType,
938}
939
940#[derive(Serialize, Deserialize)]
941#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
942pub enum CommandResultType {
943 Accepted,
944
945 #[serde(rename = "CANCELED_RESERVATION")]
946 CanceledReservation,
947
948 #[serde(rename = "EVSE_INOPERATIVE")]
949 EvseInoperative,
950
951 #[serde(rename = "EVSE_OCCUPIED")]
952 EvseOccupied,
953
954 Failed,
955
956 #[serde(rename = "NOT_SUPPORTED")]
957 NotSupported,
958
959 Rejected,
960
961 Timeout,
962
963 #[serde(rename = "UNKNOWN_RESERVATION")]
964 UnknownReservation,
965}
966
967#[derive(Serialize, Deserialize)]
968pub struct Connector {
969 capabilities: Option<Vec<ConnectorCapability>>,
970
971 format: ConnectorFormat,
972
973 id: String,
974
975 last_updated: String,
976
977 max_amperage: i64,
978
979 max_electric_power: Option<i64>,
980
981 max_voltage: i64,
982
983 power_type: PowerType,
984
985 standard: ConnectorType,
986
987 tariff_ids: Option<Vec<String>>,
988
989 terms_and_conditions: Option<String>,
990}
991
992#[derive(Serialize, Deserialize)]
993#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
994pub enum ConnectorCapability {
995 #[serde(rename = "ISO_15118_20_PLUG_AND_CHARGE")]
996 Iso15118_20_PlugAndCharge,
997
998 #[serde(rename = "ISO_15118_2_PLUG_AND_CHARGE")]
999 Iso15118_2_PlugAndCharge,
1000}
1001
1002#[derive(Serialize, Deserialize)]
1003pub struct Credentials {
1004 hub_party_id: Option<String>,
1005
1006 roles: Vec<CredentialsRole>,
1007
1008 token: String,
1009
1010 url: String,
1011}
1012
1013#[derive(Serialize, Deserialize)]
1014pub struct CredentialsRole {
1015 business_details: BusinessDetails,
1016
1017 country_code: String,
1018
1019 party_id: String,
1020
1021 role: Role,
1022}
1023
1024#[derive(Serialize, Deserialize)]
1025pub struct BusinessDetails {
1026 logo: Option<Image>,
1027
1028 name: String,
1029
1030 website: Option<String>,
1031}
1032
1033#[derive(Serialize, Deserialize)]
1034pub struct Image {
1035 category: ImageCategory,
1036
1037 height: Option<i64>,
1038
1039 thumbnail: Option<String>,
1040
1041 #[serde(rename = "type")]
1042 image_type: String,
1043
1044 url: String,
1045
1046 width: Option<i64>,
1047}
1048
1049#[derive(Serialize, Deserialize)]
1050pub enum ImageCategory {
1051 #[serde(rename = "CHARGER")]
1052 Charger,
1053
1054 #[serde(rename = "ENTRANCE")]
1055 Entrance,
1056
1057 #[serde(rename = "LOCATION")]
1058 Location,
1059
1060 #[serde(rename = "NETWORK")]
1061 Network,
1062
1063 #[serde(rename = "OPERATOR")]
1064 Operator,
1065
1066 #[serde(rename = "OTHER")]
1067 Other,
1068
1069 #[serde(rename = "OWNER")]
1070 Owner,
1071}
1072
1073#[derive(Serialize, Deserialize)]
1074pub enum Role {
1075 #[serde(rename = "CPO")]
1076 Cpo,
1077
1078 #[serde(rename = "EMSP")]
1079 Emsp,
1080
1081 #[serde(rename = "NAP")]
1082 Nap,
1083
1084 #[serde(rename = "NSP")]
1085 Nsp,
1086
1087 #[serde(rename = "OTHER")]
1088 Other,
1089
1090 #[serde(rename = "SCSP")]
1091 Scsp,
1092}
1093
1094#[derive(Serialize, Deserialize)]
1095pub struct Endpoint {
1096 identifier: ModuleId,
1097
1098 role: InterfaceRole,
1099
1100 url: String,
1101}
1102
1103#[derive(Serialize, Deserialize)]
1104#[serde(rename_all = "snake_case")]
1105pub enum ModuleId {
1106 Cdrs,
1107
1108 Chargingprofiles,
1109
1110 Commands,
1111
1112 Credentials,
1113
1114 Hubclientinfo,
1115
1116 Locations,
1117
1118 Sessions,
1119
1120 Tariffs,
1121
1122 Tokens,
1123}
1124
1125#[derive(Serialize, Deserialize)]
1126pub enum InterfaceRole {
1127 #[serde(rename = "RECEIVER")]
1128 Receiver,
1129
1130 #[serde(rename = "SENDER")]
1131 Sender,
1132}
1133
1134#[derive(Serialize, Deserialize)]
1135pub struct Evse {
1136 accepted_service_providers: Option<Vec<String>>,
1137
1138 capabilities: Option<Vec<Capability>>,
1139
1140 connectors: Vec<Connector>,
1141
1142 coordinates: Option<GeoLocation>,
1143
1144 directions: Option<Vec<DisplayText>>,
1145
1146 evse_id: Option<String>,
1147
1148 floor_level: Option<String>,
1149
1150 images: Option<Vec<Image>>,
1151
1152 last_updated: String,
1153
1154 parking: Option<Vec<EvseParking>>,
1155
1156 parking_restrictions: Option<Vec<ParkingRestriction>>,
1157
1158 physical_reference: Option<String>,
1159
1160 status: Status,
1161
1162 status_schedule: Option<Vec<StatusSchedule>>,
1163
1164 uid: String,
1165}
1166
1167#[derive(Serialize, Deserialize)]
1168#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
1169pub enum Capability {
1170 #[serde(rename = "CHARGING_PREFERENCES_CAPABLE")]
1171 ChargingPreferencesCapable,
1172
1173 #[serde(rename = "CHARGING_PROFILE_CAPABLE")]
1174 ChargingProfileCapable,
1175
1176 #[serde(rename = "CHIP_CARD_SUPPORT")]
1177 ChipCardSupport,
1178
1179 #[serde(rename = "CONTACTLESS_CARD_SUPPORT")]
1180 ContactlessCardSupport,
1181
1182 #[serde(rename = "CREDIT_CARD_PAYABLE")]
1183 CreditCardPayable,
1184
1185 #[serde(rename = "DEBIT_CARD_PAYABLE")]
1186 DebitCardPayable,
1187
1188 #[serde(rename = "PED_TERMINAL")]
1189 PedTerminal,
1190
1191 #[serde(rename = "REMOTE_START_STOP_CAPABLE")]
1192 RemoteStartStopCapable,
1193
1194 Reservable,
1195
1196 #[serde(rename = "RFID_READER")]
1197 RfidReader,
1198
1199 #[serde(rename = "START_SESSION_CONNECTOR_REQUIRED")]
1200 StartSessionConnectorRequired,
1201
1202 #[serde(rename = "TOKEN_GROUP_CAPABLE")]
1203 TokenGroupCapable,
1204
1205 #[serde(rename = "UNLOCK_CAPABLE")]
1206 UnlockCapable,
1207}
1208
1209#[derive(Serialize, Deserialize)]
1210pub struct EvseParking {
1211 evse_position: Option<EvsePosition>,
1212
1213 parking_id: String,
1214}
1215
1216#[derive(Serialize, Deserialize)]
1217pub enum EvsePosition {
1218 #[serde(rename = "CENTER")]
1219 Center,
1220
1221 #[serde(rename = "LEFT")]
1222 Left,
1223
1224 #[serde(rename = "RIGHT")]
1225 Right,
1226}
1227
1228#[derive(Serialize, Deserialize)]
1229#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
1230pub enum ParkingRestriction {
1231 Customers,
1232
1233 Disabled,
1234
1235 Employees,
1236
1237 #[serde(rename = "EV_ONLY")]
1238 EvOnly,
1239
1240 Motorcycles,
1241
1242 Plugged,
1243
1244 Taxis,
1245
1246 Tenants,
1247}
1248
1249#[derive(Serialize, Deserialize)]
1250pub enum Status {
1251 #[serde(rename = "AVAILABLE")]
1252 Available,
1253
1254 #[serde(rename = "BLOCKED")]
1255 Blocked,
1256
1257 #[serde(rename = "CHARGING")]
1258 Charging,
1259
1260 #[serde(rename = "INOPERATIVE")]
1261 Inoperative,
1262
1263 #[serde(rename = "OUTOFORDER")]
1264 Outoforder,
1265
1266 #[serde(rename = "PLANNED")]
1267 Planned,
1268
1269 #[serde(rename = "REMOVED")]
1270 Removed,
1271
1272 #[serde(rename = "RESERVED")]
1273 Reserved,
1274
1275 #[serde(rename = "UNKNOWN")]
1276 Unknown,
1277}
1278
1279#[derive(Serialize, Deserialize)]
1280pub struct StatusSchedule {
1281 period_begin: String,
1282
1283 period_end: Option<String>,
1284
1285 status: Status,
1286}
1287
1288#[derive(Serialize, Deserialize)]
1289pub struct HubClientInfo {
1290 country_code: String,
1291
1292 last_updated: String,
1293
1294 party_id: String,
1295
1296 role: Role,
1297
1298 status: ConnectionStatus,
1299}
1300
1301#[derive(Serialize, Deserialize)]
1302pub enum ConnectionStatus {
1303 #[serde(rename = "CONNECTED")]
1304 Connected,
1305
1306 #[serde(rename = "OFFLINE")]
1307 Offline,
1308
1309 #[serde(rename = "PLANNED")]
1310 Planned,
1311
1312 #[serde(rename = "SUSPENDED")]
1313 Suspended,
1314}
1315
1316#[derive(Serialize, Deserialize)]
1317pub struct Location {
1318 address: String,
1319
1320 charging_when_closed: Option<bool>,
1321
1322 city: String,
1323
1324 coordinates: GeoLocation,
1325
1326 country: String,
1327
1328 country_code: String,
1329
1330 directions: Option<Vec<DisplayText>>,
1331
1332 energy_mix: Option<EnergyMix>,
1333
1334 evses: Option<Vec<Evse>>,
1335
1336 facilities: Option<Vec<Facility>>,
1337
1338 help_phone: Option<String>,
1339
1340 id: String,
1341
1342 images: Option<Vec<Image>>,
1343
1344 last_updated: String,
1345
1346 name: Option<String>,
1347
1348 opening_times: Option<Hours>,
1349
1350 operator: Option<BusinessDetails>,
1351
1352 owner: Option<BusinessDetails>,
1353
1354 parking_places: Option<Vec<Parking>>,
1355
1356 parking_type: Option<ParkingType>,
1357
1358 party_id: String,
1359
1360 postal_code: Option<String>,
1361
1362 publish: bool,
1363
1364 publish_allowed_to: Option<Vec<PublishTokenType>>,
1365
1366 related_locations: Option<Vec<AdditionalGeoLocation>>,
1367
1368 state: Option<String>,
1369
1370 suboperator: Option<BusinessDetails>,
1371
1372 time_zone: String,
1373}
1374
1375#[derive(Serialize, Deserialize)]
1376#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
1377pub enum Facility {
1378 Airport,
1379
1380 #[serde(rename = "BIKE_SHARING")]
1381 BikeSharing,
1382
1383 #[serde(rename = "BUS_STOP")]
1384 BusStop,
1385
1386 Cafe,
1387
1388 #[serde(rename = "CARPOOL_PARKING")]
1389 CarpoolParking,
1390
1391 #[serde(rename = "FUEL_STATION")]
1392 FuelStation,
1393
1394 Hotel,
1395
1396 Mall,
1397
1398 #[serde(rename = "METRO_STATION")]
1399 MetroStation,
1400
1401 Museum,
1402
1403 Nature,
1404
1405 #[serde(rename = "PARKING_LOT")]
1406 ParkingLot,
1407
1408 #[serde(rename = "RECREATION_AREA")]
1409 RecreationArea,
1410
1411 Restaurant,
1412
1413 Sport,
1414
1415 Supermarket,
1416
1417 #[serde(rename = "TAXI_STAND")]
1418 TaxiStand,
1419
1420 #[serde(rename = "TRAIN_STATION")]
1421 TrainStation,
1422
1423 #[serde(rename = "TRAM_STOP")]
1424 TramStop,
1425
1426 Wifi,
1427}
1428
1429#[derive(Serialize, Deserialize)]
1430pub struct Hours {
1431 exceptional_closings: Option<Vec<ExceptionalPeriod>>,
1432
1433 exceptional_openings: Option<Vec<ExceptionalPeriod>>,
1434
1435 regular_hours: Option<Vec<RegularHours>>,
1436
1437 twentyfourseven: bool,
1438}
1439
1440#[derive(Serialize, Deserialize)]
1441pub struct ExceptionalPeriod {
1442 period_begin: String,
1443
1444 period_end: String,
1445}
1446
1447#[derive(Serialize, Deserialize)]
1448pub struct RegularHours {
1449 period_begin: String,
1450
1451 period_end: String,
1452
1453 weekday: i64,
1454}
1455
1456#[derive(Serialize, Deserialize)]
1457pub struct Parking {
1458 apds_reference: Option<String>,
1459
1460 dangerous_goods_allowed: Option<bool>,
1461
1462 direction: Option<ParkingDirection>,
1463
1464 drive_through: Option<bool>,
1465
1466 id: String,
1467
1468 images: Option<Vec<Image>>,
1469
1470 lighting: Option<bool>,
1471
1472 max_vehicle_height: Option<f64>,
1473
1474 max_vehicle_length: Option<f64>,
1475
1476 max_vehicle_weight: Option<f64>,
1477
1478 max_vehicle_width: Option<f64>,
1479
1480 parking_space_length: Option<f64>,
1481
1482 parking_space_width: Option<f64>,
1483
1484 physical_reference: Option<String>,
1485
1486 refrigeration_outlet: Option<bool>,
1487
1488 reservation_required: bool,
1489
1490 restricted_to_type: bool,
1491
1492 roofed: Option<bool>,
1493
1494 standards: Option<Vec<String>>,
1495
1496 time_limit: Option<f64>,
1497
1498 vehicle_types: Vec<VehicleType>,
1499}
1500
1501#[derive(Serialize, Deserialize)]
1502pub enum ParkingDirection {
1503 #[serde(rename = "ANGLE")]
1504 Angle,
1505
1506 #[serde(rename = "PARALLEL")]
1507 Parallel,
1508
1509 #[serde(rename = "PERPENDICULAR")]
1510 Perpendicular,
1511}
1512
1513#[derive(Serialize, Deserialize)]
1514#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
1515pub enum VehicleType {
1516 Bus,
1517
1518 Disabled,
1519
1520 Motorcycle,
1521
1522 #[serde(rename = "PERSONAL_VEHICLE")]
1523 PersonalVehicle,
1524
1525 #[serde(rename = "PERSONAL_VEHICLE_WITH_TRAILER")]
1526 PersonalVehicleWithTrailer,
1527
1528 Rigid,
1529
1530 #[serde(rename = "SEMI_TRACTOR")]
1531 SemiTractor,
1532
1533 #[serde(rename = "TRUCK_WITH_TRAILER")]
1534 TruckWithTrailer,
1535
1536 Van,
1537}
1538
1539#[derive(Serialize, Deserialize)]
1540#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
1541pub enum ParkingType {
1542 #[serde(rename = "ALONG_MOTORWAY")]
1543 AlongMotorway,
1544
1545 #[serde(rename = "ON_DRIVEWAY")]
1546 OnDriveway,
1547
1548 #[serde(rename = "ON_STREET")]
1549 OnStreet,
1550
1551 #[serde(rename = "PARKING_GARAGE")]
1552 ParkingGarage,
1553
1554 #[serde(rename = "PARKING_LOT")]
1555 ParkingLot,
1556
1557 #[serde(rename = "UNDERGROUND_GARAGE")]
1558 UndergroundGarage,
1559}
1560
1561#[derive(Serialize, Deserialize)]
1562pub struct PublishTokenType {
1563 group_id: Option<String>,
1564
1565 issuer: Option<String>,
1566
1567 #[serde(rename = "type")]
1568 publish_token_type_type: Option<TokenType>,
1569
1570 uid: Option<String>,
1571
1572 visual_number: Option<String>,
1573}
1574
1575#[derive(Serialize, Deserialize)]
1576pub struct AdditionalGeoLocation {
1577 latitude: String,
1578
1579 longitude: String,
1580
1581 name: Option<DisplayText>,
1582}
1583
1584#[derive(Serialize, Deserialize)]
1585pub struct ReserveNow {
1586 authorization_reference: Option<String>,
1587
1588 evse_uid: Option<String>,
1589
1590 expiry_date: String,
1591
1592 location_id: String,
1593
1594 reservation_id: String,
1595
1596 response_url: String,
1597
1598 token: Token,
1599}
1600
1601#[derive(Serialize, Deserialize)]
1602pub struct Session {
1603 auth_method: AuthMethod,
1604
1605 authorization_reference: Option<String>,
1606
1607 cdr_token: CdrToken,
1608
1609 charging_periods: Option<Vec<ChargingPeriod>>,
1610
1611 connector_id: String,
1612
1613 country_code: String,
1614
1615 currency: String,
1616
1617 end_date_time: Option<String>,
1618
1619 evse_uid: String,
1620
1621 id: String,
1622
1623 kwh: f64,
1624
1625 last_updated: String,
1626
1627 location_id: String,
1628
1629 meter_id: Option<String>,
1630
1631 party_id: String,
1632
1633 start_date_time: String,
1634
1635 status: SessionStatus,
1636
1637 total_cost: Option<Price>,
1638}
1639
1640#[derive(Serialize, Deserialize)]
1641pub enum SessionStatus {
1642 #[serde(rename = "ACTIVE")]
1643 Active,
1644
1645 #[serde(rename = "COMPLETED")]
1646 Completed,
1647
1648 #[serde(rename = "INVALID")]
1649 Invalid,
1650
1651 #[serde(rename = "PENDING")]
1652 Pending,
1653
1654 #[serde(rename = "RESERVATION")]
1655 Reservation,
1656}
1657
1658#[derive(Serialize, Deserialize)]
1659pub struct SetChargingProfile {
1660 charging_profile: ChargingProfile,
1661
1662 response_url: String,
1663}
1664
1665#[derive(Serialize, Deserialize)]
1666pub struct StartSession {
1667 authorization_reference: Option<String>,
1668
1669 connector_id: Option<String>,
1670
1671 evse_uid: Option<String>,
1672
1673 location_id: String,
1674
1675 response_url: String,
1676
1677 token: Token,
1678}
1679
1680#[derive(Serialize, Deserialize)]
1681pub struct StopSession {
1682 response_url: String,
1683
1684 session_id: String,
1685}
1686
1687#[derive(Serialize, Deserialize)]
1688pub struct UnlockConnector {
1689 connector_id: String,
1690
1691 evse_uid: String,
1692
1693 location_id: String,
1694
1695 response_url: String,
1696}
1697
1698#[derive(Serialize, Deserialize)]
1699pub struct Version {
1700 url: String,
1701
1702 version: VersionNumber,
1703}
1704
1705#[derive(Serialize, Deserialize)]
1706pub enum VersionNumber {
1707 #[serde(rename = "2.0")]
1708 The20,
1709
1710 #[serde(rename = "2.1")]
1711 The21,
1712
1713 #[serde(rename = "2.1.1")]
1714 The211,
1715
1716 #[serde(rename = "2.2")]
1717 The22,
1718
1719 #[serde(rename = "2.2.1")]
1720 The221,
1721
1722 #[serde(rename = "2.3.0")]
1723 The230,
1724}
1725
1726#[derive(Serialize, Deserialize)]
1727pub struct VersionDetails {
1728 endpoints: Vec<Endpoint>,
1729
1730 version: VersionNumber,
1731}