use super::data_types::{DateTimeWrapper, IdTagInfo, KeyValue};
use super::enums::ParsedGenericStatus;
use super::utils::{iso8601_date_time, iso8601_date_time_optional};
use alloc::collections::btree_map::BTreeMap;
use alloc::string::String;
use alloc::vec::Vec;
use serde::{Deserialize, Serialize};
use serde_tuple::{Deserialize_tuple, Serialize_tuple};
use strum_macros::AsRefStr;
#[derive(AsRefStr, Debug, PartialEq, Eq, Serialize, Deserialize, Clone)]
#[serde(untagged)]
pub enum ResultPayload {
StartTransaction(StartTransaction),
BootNotification(BootNotification),
Heartbeat(Heartbeat),
GetLocalListVersion(GetLocalListVersion),
PossibleStatusResponse(StatusResponses),
PossibleEmptyResponse(EmptyResponses),
}
#[derive(AsRefStr, Debug, PartialEq, Eq, Serialize, Deserialize, Clone)]
#[serde(untagged)]
pub enum EmptyResponses {
EmptyResponse(EmptyResponse),
GenericIdTagInfoResponse(GenericIdTagInfo),
GetConfiguration(GetConfiguration),
GetDiagnostics(GetDiagnostics),
}
impl EmptyResponses {
#[must_use]
pub fn is_empty(&self) -> bool {
match self {
Self::EmptyResponse(_) => true,
Self::GetConfiguration(get_configuration) => get_configuration.is_empty(),
Self::GetDiagnostics(get_diagnostics) => get_diagnostics.is_empty(),
Self::GenericIdTagInfoResponse(generic_id_tag_info) => generic_id_tag_info.is_empty(),
}
}
}
#[derive(AsRefStr, Debug, PartialEq, Eq, Serialize, Deserialize, Clone)]
#[serde(untagged)]
pub enum StatusResponses {
StatusResponse(GenericStatusResponse),
GetInstalledCertificateIds(GetInstalledCertificateIds),
GetCompositeSchedule(GetCompositeSchedule),
GetLog(GetLog),
DataTransfer(DataTransfer),
}
impl StatusResponses {
#[must_use]
pub const fn get_status(&self) -> &ParsedGenericStatus {
match self {
Self::StatusResponse(generic_status_response) => &generic_status_response.status,
Self::GetInstalledCertificateIds(get_installed_certificate_ids) => {
&get_installed_certificate_ids.status
}
Self::GetCompositeSchedule(get_composite_schedule) => &get_composite_schedule.status,
Self::GetLog(get_log) => &get_log.status,
Self::DataTransfer(data_transfer) => &data_transfer.status,
}
}
#[must_use]
pub fn is_only_status(&self) -> bool {
match self {
Self::StatusResponse(generic_status_response) => {
generic_status_response.is_only_status()
}
Self::GetInstalledCertificateIds(get_installed_certificate_ids) => {
get_installed_certificate_ids.is_only_status()
}
Self::GetCompositeSchedule(get_composite_schedule) => {
get_composite_schedule.is_only_status()
}
Self::GetLog(get_log) => get_log.is_only_status(),
Self::DataTransfer(data_transfer) => data_transfer.is_only_status(),
}
}
}
pub trait Status {
fn is_only_status(&self) -> bool;
}
pub trait PossibleEmpty {
fn is_empty(&self) -> bool;
}
#[derive(Debug, PartialEq, Eq, Serialize_tuple, Deserialize_tuple, Clone)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct CallResult {
pub(super) message_id: i32,
pub unique_id: String,
pub payload: ResultPayload,
}
impl CallResult {
#[must_use]
pub const fn new(unique_id: String, payload: ResultPayload) -> Self {
Self {
message_id: 3,
unique_id,
payload,
}
}
}
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Clone, Default)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct BootNotification {
#[serde(with = "iso8601_date_time")]
pub current_time: DateTimeWrapper,
pub interval: i32,
pub status: ParsedGenericStatus,
}
impl Status for BootNotification {
fn is_only_status(&self) -> bool {
false
}
}
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Clone, Default)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct Heartbeat {
#[serde(with = "iso8601_date_time")]
pub current_time: DateTimeWrapper,
}
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Clone, Default)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct EmptyResponse {}
impl PossibleEmpty for EmptyResponse {
fn is_empty(&self) -> bool {
true
}
}
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Clone, Default)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct StartTransaction {
pub transaction_id: i32,
pub id_tag_info: IdTagInfo,
}
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Clone, Default)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct GenericIdTagInfo {
#[serde(skip_serializing_if = "Option::is_none")]
pub id_tag_info: Option<IdTagInfo>,
}
impl PossibleEmpty for GenericIdTagInfo {
fn is_empty(&self) -> bool {
self.id_tag_info.is_none()
}
}
impl GenericIdTagInfo {
#[must_use]
pub fn get_id_tag_info(self) -> Option<IdTagInfo> {
self.id_tag_info
}
}
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Clone, Default)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct GenericStatusResponse {
pub status: ParsedGenericStatus,
}
impl Status for GenericStatusResponse {
fn is_only_status(&self) -> bool {
true
}
}
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Clone, Default)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct GetInstalledCertificateIds {
pub status: ParsedGenericStatus,
pub certificate_hash_data: Option<Vec<String>>,
}
impl Status for GetInstalledCertificateIds {
fn is_only_status(&self) -> bool {
self.certificate_hash_data.is_none()
}
}
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Clone, Default)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct GetCompositeSchedule {
pub status: ParsedGenericStatus,
pub connector_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
#[serde(with = "iso8601_date_time_optional")]
pub schedule_start: Option<DateTimeWrapper>,
#[serde(skip_serializing_if = "Option::is_none")]
pub charging_schedule: Option<BTreeMap<String, String>>,
}
impl Status for GetCompositeSchedule {
fn is_only_status(&self) -> bool {
self.connector_id.is_none()
&& self.schedule_start.is_none()
&& self.charging_schedule.is_none()
}
}
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Clone, Default)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct GetConfiguration {
#[serde(skip_serializing_if = "Option::is_none")]
pub configuration_key: Option<Vec<KeyValue>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub unknown_key: Option<Vec<String>>,
}
impl PossibleEmpty for GetConfiguration {
fn is_empty(&self) -> bool {
self.configuration_key.is_none() && self.unknown_key.is_none()
}
}
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Clone, Default)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct GetDiagnostics {
#[serde(skip_serializing_if = "Option::is_none")]
pub file_name: Option<String>,
}
impl PossibleEmpty for GetDiagnostics {
fn is_empty(&self) -> bool {
self.file_name.is_none()
}
}
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Clone, Default)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct GetLocalListVersion {
pub list_version: i32,
}
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Clone, Default)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct GetLog {
pub status: ParsedGenericStatus,
#[serde(skip_serializing_if = "Option::is_none")]
pub filename: Option<String>,
}
impl Status for GetLog {
fn is_only_status(&self) -> bool {
self.filename.is_none()
}
}
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Clone, Default)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct UnlockConnector {
pub status: GenericStatusResponse,
}
#[derive(Debug, PartialEq, Eq, Serialize, Deserialize, Clone, Default)]
#[serde(rename_all = "camelCase", deny_unknown_fields)]
pub struct DataTransfer {
pub status: ParsedGenericStatus,
#[serde(skip_serializing_if = "Option::is_none")]
pub data: Option<String>,
}
impl Status for DataTransfer {
fn is_only_status(&self) -> bool {
self.data.is_none()
}
}