#![deny(missing_docs)]
#![deny(unsafe_code)]
#![warn(clippy::pedantic)]
#![allow(clippy::module_name_repetitions)]
use serde::{Deserialize, Serialize};
use chrono::{DateTime, Utc};
use crate::types::{
Action, BizLocation, BizTransaction, Destination, Epc,
ErrorDeclaration, QuantityElement, ReadPoint, SensorElement, Source,
};
use crate::cbv::{BizStep, Disposition};
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PersistentDisposition {
#[serde(skip_serializing_if = "Option::is_none")]
pub unset: Option<Vec<Disposition>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub set: Option<Vec<Disposition>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ObjectEvent {
#[serde(with = "crate::document::datetime_serde")]
pub event_time: DateTime<Utc>,
pub event_time_zone_offset: String,
#[serde(default, with = "crate::document::opt_datetime_serde", skip_serializing_if = "Option::is_none")]
pub record_time: Option<DateTime<Utc>>,
#[serde(rename = "eventID", skip_serializing_if = "Option::is_none")]
pub event_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error_declaration: Option<ErrorDeclaration>,
pub action: Action,
#[serde(skip_serializing_if = "Option::is_none")]
pub epc_list: Option<Vec<Epc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub quantity_list: Option<Vec<QuantityElement>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub biz_step: Option<BizStep>,
#[serde(skip_serializing_if = "Option::is_none")]
pub disposition: Option<Disposition>,
#[serde(skip_serializing_if = "Option::is_none")]
pub read_point: Option<ReadPoint>,
#[serde(skip_serializing_if = "Option::is_none")]
pub biz_location: Option<BizLocation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub biz_transaction_list: Option<Vec<BizTransaction>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub source_list: Option<Vec<Source>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub destination_list: Option<Vec<Destination>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sensor_element_list: Option<Vec<SensorElement>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub persistent_disposition: Option<PersistentDisposition>,
#[serde(flatten)]
pub extensions: serde_json::Map<String, serde_json::Value>,
}
impl ObjectEvent {
#[must_use]
pub fn new(event_time: DateTime<Utc>, tz_offset: String, action: Action) -> Self {
Self {
event_time,
event_time_zone_offset: tz_offset,
record_time: None,
event_id: None,
error_declaration: None,
action,
epc_list: None,
quantity_list: None,
biz_step: None,
disposition: None,
read_point: None,
biz_location: None,
biz_transaction_list: None,
source_list: None,
destination_list: None,
sensor_element_list: None,
persistent_disposition: None,
extensions: serde_json::Map::new(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AggregationEvent {
#[serde(with = "crate::document::datetime_serde")]
pub event_time: DateTime<Utc>,
pub event_time_zone_offset: String,
#[serde(default, with = "crate::document::opt_datetime_serde", skip_serializing_if = "Option::is_none")]
pub record_time: Option<DateTime<Utc>>,
#[serde(rename = "eventID", skip_serializing_if = "Option::is_none")]
pub event_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error_declaration: Option<ErrorDeclaration>,
pub action: Action,
#[serde(rename = "parentID", skip_serializing_if = "Option::is_none")]
pub parent_id: Option<Epc>,
#[serde(skip_serializing_if = "Option::is_none")]
pub child_e_p_cs: Option<Vec<Epc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub child_quantity_list: Option<Vec<QuantityElement>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub biz_step: Option<BizStep>,
#[serde(skip_serializing_if = "Option::is_none")]
pub disposition: Option<Disposition>,
#[serde(skip_serializing_if = "Option::is_none")]
pub read_point: Option<ReadPoint>,
#[serde(skip_serializing_if = "Option::is_none")]
pub biz_location: Option<BizLocation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub biz_transaction_list: Option<Vec<BizTransaction>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub source_list: Option<Vec<Source>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub destination_list: Option<Vec<Destination>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sensor_element_list: Option<Vec<SensorElement>>,
#[serde(flatten)]
pub extensions: serde_json::Map<String, serde_json::Value>,
}
impl AggregationEvent {
#[must_use]
pub fn new(event_time: DateTime<Utc>, tz_offset: String, action: Action) -> Self {
Self {
event_time,
event_time_zone_offset: tz_offset,
record_time: None,
event_id: None,
error_declaration: None,
action,
parent_id: None,
child_e_p_cs: None,
child_quantity_list: None,
biz_step: None,
disposition: None,
read_point: None,
biz_location: None,
biz_transaction_list: None,
source_list: None,
destination_list: None,
sensor_element_list: None,
extensions: serde_json::Map::new(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TransformationEvent {
#[serde(with = "crate::document::datetime_serde")]
pub event_time: DateTime<Utc>,
pub event_time_zone_offset: String,
#[serde(default, with = "crate::document::opt_datetime_serde", skip_serializing_if = "Option::is_none")]
pub record_time: Option<DateTime<Utc>>,
#[serde(rename = "eventID", skip_serializing_if = "Option::is_none")]
pub event_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error_declaration: Option<ErrorDeclaration>,
#[serde(skip_serializing_if = "Option::is_none")]
pub input_e_p_c_list: Option<Vec<Epc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub input_quantity_list: Option<Vec<QuantityElement>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub output_e_p_c_list: Option<Vec<Epc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub output_quantity_list: Option<Vec<QuantityElement>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub transformation_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub biz_step: Option<BizStep>,
#[serde(skip_serializing_if = "Option::is_none")]
pub disposition: Option<Disposition>,
#[serde(skip_serializing_if = "Option::is_none")]
pub read_point: Option<ReadPoint>,
#[serde(skip_serializing_if = "Option::is_none")]
pub biz_location: Option<BizLocation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub biz_transaction_list: Option<Vec<BizTransaction>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub source_list: Option<Vec<Source>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub destination_list: Option<Vec<Destination>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sensor_element_list: Option<Vec<SensorElement>>,
#[serde(flatten)]
pub extensions: serde_json::Map<String, serde_json::Value>,
}
impl TransformationEvent {
#[must_use]
pub fn new(event_time: DateTime<Utc>, tz_offset: String) -> Self {
Self {
event_time,
event_time_zone_offset: tz_offset,
record_time: None,
event_id: None,
error_declaration: None,
input_e_p_c_list: None,
input_quantity_list: None,
output_e_p_c_list: None,
output_quantity_list: None,
transformation_id: None,
biz_step: None,
disposition: None,
read_point: None,
biz_location: None,
biz_transaction_list: None,
source_list: None,
destination_list: None,
sensor_element_list: None,
extensions: serde_json::Map::new(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AssociationEvent {
#[serde(with = "crate::document::datetime_serde")]
pub event_time: DateTime<Utc>,
pub event_time_zone_offset: String,
#[serde(default, with = "crate::document::opt_datetime_serde", skip_serializing_if = "Option::is_none")]
pub record_time: Option<DateTime<Utc>>,
#[serde(rename = "eventID", skip_serializing_if = "Option::is_none")]
pub event_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error_declaration: Option<ErrorDeclaration>,
pub action: Action,
#[serde(rename = "parentID", skip_serializing_if = "Option::is_none")]
pub parent_id: Option<Epc>,
#[serde(skip_serializing_if = "Option::is_none")]
pub child_e_p_cs: Option<Vec<Epc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub child_quantity_list: Option<Vec<QuantityElement>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub biz_step: Option<BizStep>,
#[serde(skip_serializing_if = "Option::is_none")]
pub disposition: Option<Disposition>,
#[serde(skip_serializing_if = "Option::is_none")]
pub read_point: Option<ReadPoint>,
#[serde(skip_serializing_if = "Option::is_none")]
pub biz_location: Option<BizLocation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub biz_transaction_list: Option<Vec<BizTransaction>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub source_list: Option<Vec<Source>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub destination_list: Option<Vec<Destination>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sensor_element_list: Option<Vec<SensorElement>>,
#[serde(flatten)]
pub extensions: serde_json::Map<String, serde_json::Value>,
}
impl AssociationEvent {
#[must_use]
pub fn new(event_time: DateTime<Utc>, tz_offset: String, action: Action) -> Self {
Self {
event_time,
event_time_zone_offset: tz_offset,
record_time: None,
event_id: None,
error_declaration: None,
action,
parent_id: None,
child_e_p_cs: None,
child_quantity_list: None,
biz_step: None,
disposition: None,
read_point: None,
biz_location: None,
biz_transaction_list: None,
source_list: None,
destination_list: None,
sensor_element_list: None,
extensions: serde_json::Map::new(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TransactionEvent {
#[serde(with = "crate::document::datetime_serde")]
pub event_time: DateTime<Utc>,
pub event_time_zone_offset: String,
#[serde(default, with = "crate::document::opt_datetime_serde", skip_serializing_if = "Option::is_none")]
pub record_time: Option<DateTime<Utc>>,
#[serde(rename = "eventID", skip_serializing_if = "Option::is_none")]
pub event_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error_declaration: Option<ErrorDeclaration>,
pub action: Action,
#[serde(rename = "parentID", skip_serializing_if = "Option::is_none")]
pub parent_id: Option<Epc>,
#[serde(skip_serializing_if = "Option::is_none")]
pub epc_list: Option<Vec<Epc>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub quantity_list: Option<Vec<QuantityElement>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub biz_step: Option<BizStep>,
#[serde(skip_serializing_if = "Option::is_none")]
pub disposition: Option<Disposition>,
#[serde(skip_serializing_if = "Option::is_none")]
pub read_point: Option<ReadPoint>,
#[serde(skip_serializing_if = "Option::is_none")]
pub biz_location: Option<BizLocation>,
#[serde(skip_serializing_if = "Option::is_none")]
pub biz_transaction_list: Option<Vec<BizTransaction>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub source_list: Option<Vec<Source>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub destination_list: Option<Vec<Destination>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sensor_element_list: Option<Vec<SensorElement>>,
#[serde(flatten)]
pub extensions: serde_json::Map<String, serde_json::Value>,
}
impl TransactionEvent {
#[must_use]
pub fn new(event_time: DateTime<Utc>, tz_offset: String, action: Action) -> Self {
Self {
event_time,
event_time_zone_offset: tz_offset,
record_time: None,
event_id: None,
error_declaration: None,
action,
parent_id: None,
epc_list: None,
quantity_list: None,
biz_step: None,
disposition: None,
read_point: None,
biz_location: None,
biz_transaction_list: None,
source_list: None,
destination_list: None,
sensor_element_list: None,
extensions: serde_json::Map::new(),
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type")]
pub enum EPCISEvent {
ObjectEvent(ObjectEvent),
AggregationEvent(AggregationEvent),
TransformationEvent(TransformationEvent),
AssociationEvent(AssociationEvent),
TransactionEvent(TransactionEvent),
}