1#![deny(missing_docs)]
4#![deny(unsafe_code)]
5#![warn(clippy::pedantic)]
6#![allow(clippy::module_name_repetitions)]
7
8use serde::{Deserialize, Serialize};
9use chrono::{DateTime, Utc};
10use crate::types::{
11 Action, BizLocation, BizTransaction, Destination, Epc,
12 ErrorDeclaration, QuantityElement, ReadPoint, SensorElement, Source,
13};
14use crate::cbv::{BizStep, Disposition};
15
16#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
18#[serde(rename_all = "camelCase")]
19pub struct PersistentDisposition {
20 #[serde(skip_serializing_if = "Option::is_none")]
22 pub unset: Option<Vec<Disposition>>,
23 #[serde(skip_serializing_if = "Option::is_none")]
25 pub set: Option<Vec<Disposition>>,
26}
27
28#[derive(Debug, Clone, Serialize, Deserialize)]
30#[serde(rename_all = "camelCase")]
31pub struct ObjectEvent {
32 pub event_time: DateTime<Utc>,
34 pub event_time_zone_offset: String,
36 #[serde(skip_serializing_if = "Option::is_none")]
38 pub record_time: Option<DateTime<Utc>>,
39 #[serde(rename = "eventID", skip_serializing_if = "Option::is_none")]
41 pub event_id: Option<String>,
42 #[serde(skip_serializing_if = "Option::is_none")]
44 pub error_declaration: Option<ErrorDeclaration>,
45
46 pub action: Action,
48 #[serde(skip_serializing_if = "Option::is_none")]
50 pub epc_list: Option<Vec<Epc>>,
51 #[serde(skip_serializing_if = "Option::is_none")]
53 pub quantity_list: Option<Vec<QuantityElement>>,
54
55 #[serde(skip_serializing_if = "Option::is_none")]
57 pub biz_step: Option<BizStep>,
58 #[serde(skip_serializing_if = "Option::is_none")]
60 pub disposition: Option<Disposition>,
61 #[serde(skip_serializing_if = "Option::is_none")]
63 pub read_point: Option<ReadPoint>,
64 #[serde(skip_serializing_if = "Option::is_none")]
66 pub biz_location: Option<BizLocation>,
67 #[serde(skip_serializing_if = "Option::is_none")]
69 pub biz_transaction_list: Option<Vec<BizTransaction>>,
70 #[serde(skip_serializing_if = "Option::is_none")]
72 pub source_list: Option<Vec<Source>>,
73 #[serde(skip_serializing_if = "Option::is_none")]
75 pub destination_list: Option<Vec<Destination>>,
76 #[serde(skip_serializing_if = "Option::is_none")]
78 pub sensor_element_list: Option<Vec<SensorElement>>,
79 #[serde(skip_serializing_if = "Option::is_none")]
81 pub persistent_disposition: Option<PersistentDisposition>,
82
83 #[serde(flatten)]
85 pub extensions: serde_json::Map<String, serde_json::Value>,
86}
87
88impl ObjectEvent {
89 #[must_use]
91 pub fn new(event_time: DateTime<Utc>, tz_offset: String, action: Action) -> Self {
92 Self {
93 event_time,
94 event_time_zone_offset: tz_offset,
95 record_time: None,
96 event_id: None,
97 error_declaration: None,
98 action,
99 epc_list: None,
100 quantity_list: None,
101 biz_step: None,
102 disposition: None,
103 read_point: None,
104 biz_location: None,
105 biz_transaction_list: None,
106 source_list: None,
107 destination_list: None,
108 sensor_element_list: None,
109 persistent_disposition: None,
110 extensions: serde_json::Map::new(),
111 }
112 }
113}
114
115#[derive(Debug, Clone, Serialize, Deserialize)]
117#[serde(rename_all = "camelCase")]
118pub struct AggregationEvent {
119 pub event_time: DateTime<Utc>,
121 pub event_time_zone_offset: String,
123 #[serde(skip_serializing_if = "Option::is_none")]
125 pub record_time: Option<DateTime<Utc>>,
126 #[serde(rename = "eventID", skip_serializing_if = "Option::is_none")]
128 pub event_id: Option<String>,
129 #[serde(skip_serializing_if = "Option::is_none")]
131 pub error_declaration: Option<ErrorDeclaration>,
132
133 pub action: Action,
135 #[serde(rename = "parentID", skip_serializing_if = "Option::is_none")]
137 pub parent_id: Option<Epc>,
138 #[serde(skip_serializing_if = "Option::is_none")]
140 pub child_e_p_cs: Option<Vec<Epc>>,
141 #[serde(skip_serializing_if = "Option::is_none")]
143 pub child_quantity_list: Option<Vec<QuantityElement>>,
144
145 #[serde(skip_serializing_if = "Option::is_none")]
147 pub biz_step: Option<BizStep>,
148 #[serde(skip_serializing_if = "Option::is_none")]
150 pub disposition: Option<Disposition>,
151 #[serde(skip_serializing_if = "Option::is_none")]
153 pub read_point: Option<ReadPoint>,
154 #[serde(skip_serializing_if = "Option::is_none")]
156 pub biz_location: Option<BizLocation>,
157 #[serde(skip_serializing_if = "Option::is_none")]
159 pub biz_transaction_list: Option<Vec<BizTransaction>>,
160 #[serde(skip_serializing_if = "Option::is_none")]
162 pub source_list: Option<Vec<Source>>,
163 #[serde(skip_serializing_if = "Option::is_none")]
165 pub destination_list: Option<Vec<Destination>>,
166 #[serde(skip_serializing_if = "Option::is_none")]
168 pub sensor_element_list: Option<Vec<SensorElement>>,
169
170 #[serde(flatten)]
172 pub extensions: serde_json::Map<String, serde_json::Value>,
173}
174
175impl AggregationEvent {
176 #[must_use]
178 pub fn new(event_time: DateTime<Utc>, tz_offset: String, action: Action) -> Self {
179 Self {
180 event_time,
181 event_time_zone_offset: tz_offset,
182 record_time: None,
183 event_id: None,
184 error_declaration: None,
185 action,
186 parent_id: None,
187 child_e_p_cs: None,
188 child_quantity_list: None,
189 biz_step: None,
190 disposition: None,
191 read_point: None,
192 biz_location: None,
193 biz_transaction_list: None,
194 source_list: None,
195 destination_list: None,
196 sensor_element_list: None,
197 extensions: serde_json::Map::new(),
198 }
199 }
200}
201
202#[derive(Debug, Clone, Serialize, Deserialize)]
204#[serde(rename_all = "camelCase")]
205pub struct TransformationEvent {
206 pub event_time: DateTime<Utc>,
208 pub event_time_zone_offset: String,
210 #[serde(skip_serializing_if = "Option::is_none")]
212 pub record_time: Option<DateTime<Utc>>,
213 #[serde(rename = "eventID", skip_serializing_if = "Option::is_none")]
215 pub event_id: Option<String>,
216 #[serde(skip_serializing_if = "Option::is_none")]
218 pub error_declaration: Option<ErrorDeclaration>,
219
220 #[serde(skip_serializing_if = "Option::is_none")]
222 pub input_e_p_c_list: Option<Vec<Epc>>,
223 #[serde(skip_serializing_if = "Option::is_none")]
225 pub input_quantity_list: Option<Vec<QuantityElement>>,
226 #[serde(skip_serializing_if = "Option::is_none")]
228 pub output_e_p_c_list: Option<Vec<Epc>>,
229 #[serde(skip_serializing_if = "Option::is_none")]
231 pub output_quantity_list: Option<Vec<QuantityElement>>,
232 #[serde(skip_serializing_if = "Option::is_none")]
234 pub transformation_id: Option<String>,
235
236 #[serde(skip_serializing_if = "Option::is_none")]
238 pub biz_step: Option<BizStep>,
239 #[serde(skip_serializing_if = "Option::is_none")]
241 pub disposition: Option<Disposition>,
242 #[serde(skip_serializing_if = "Option::is_none")]
244 pub read_point: Option<ReadPoint>,
245 #[serde(skip_serializing_if = "Option::is_none")]
247 pub biz_location: Option<BizLocation>,
248 #[serde(skip_serializing_if = "Option::is_none")]
250 pub biz_transaction_list: Option<Vec<BizTransaction>>,
251 #[serde(skip_serializing_if = "Option::is_none")]
253 pub source_list: Option<Vec<Source>>,
254 #[serde(skip_serializing_if = "Option::is_none")]
256 pub destination_list: Option<Vec<Destination>>,
257 #[serde(skip_serializing_if = "Option::is_none")]
259 pub sensor_element_list: Option<Vec<SensorElement>>,
260
261 #[serde(flatten)]
263 pub extensions: serde_json::Map<String, serde_json::Value>,
264}
265
266impl TransformationEvent {
267 #[must_use]
269 pub fn new(event_time: DateTime<Utc>, tz_offset: String) -> Self {
270 Self {
271 event_time,
272 event_time_zone_offset: tz_offset,
273 record_time: None,
274 event_id: None,
275 error_declaration: None,
276 input_e_p_c_list: None,
277 input_quantity_list: None,
278 output_e_p_c_list: None,
279 output_quantity_list: None,
280 transformation_id: None,
281 biz_step: None,
282 disposition: None,
283 read_point: None,
284 biz_location: None,
285 biz_transaction_list: None,
286 source_list: None,
287 destination_list: None,
288 sensor_element_list: None,
289 extensions: serde_json::Map::new(),
290 }
291 }
292}
293
294#[derive(Debug, Clone, Serialize, Deserialize)]
296#[serde(rename_all = "camelCase")]
297pub struct AssociationEvent {
298 pub event_time: DateTime<Utc>,
300 pub event_time_zone_offset: String,
302 #[serde(skip_serializing_if = "Option::is_none")]
304 pub record_time: Option<DateTime<Utc>>,
305 #[serde(rename = "eventID", skip_serializing_if = "Option::is_none")]
307 pub event_id: Option<String>,
308 #[serde(skip_serializing_if = "Option::is_none")]
310 pub error_declaration: Option<ErrorDeclaration>,
311
312 pub action: Action,
314 #[serde(rename = "parentID", skip_serializing_if = "Option::is_none")]
316 pub parent_id: Option<Epc>,
317 #[serde(skip_serializing_if = "Option::is_none")]
319 pub child_e_p_cs: Option<Vec<Epc>>,
320 #[serde(skip_serializing_if = "Option::is_none")]
322 pub child_quantity_list: Option<Vec<QuantityElement>>,
323
324 #[serde(skip_serializing_if = "Option::is_none")]
326 pub biz_step: Option<BizStep>,
327 #[serde(skip_serializing_if = "Option::is_none")]
329 pub disposition: Option<Disposition>,
330 #[serde(skip_serializing_if = "Option::is_none")]
332 pub read_point: Option<ReadPoint>,
333 #[serde(skip_serializing_if = "Option::is_none")]
335 pub biz_location: Option<BizLocation>,
336 #[serde(skip_serializing_if = "Option::is_none")]
338 pub biz_transaction_list: Option<Vec<BizTransaction>>,
339 #[serde(skip_serializing_if = "Option::is_none")]
341 pub source_list: Option<Vec<Source>>,
342 #[serde(skip_serializing_if = "Option::is_none")]
344 pub destination_list: Option<Vec<Destination>>,
345 #[serde(skip_serializing_if = "Option::is_none")]
347 pub sensor_element_list: Option<Vec<SensorElement>>,
348
349 #[serde(flatten)]
351 pub extensions: serde_json::Map<String, serde_json::Value>,
352}
353
354impl AssociationEvent {
355 #[must_use]
357 pub fn new(event_time: DateTime<Utc>, tz_offset: String, action: Action) -> Self {
358 Self {
359 event_time,
360 event_time_zone_offset: tz_offset,
361 record_time: None,
362 event_id: None,
363 error_declaration: None,
364 action,
365 parent_id: None,
366 child_e_p_cs: None,
367 child_quantity_list: None,
368 biz_step: None,
369 disposition: None,
370 read_point: None,
371 biz_location: None,
372 biz_transaction_list: None,
373 source_list: None,
374 destination_list: None,
375 sensor_element_list: None,
376 extensions: serde_json::Map::new(),
377 }
378 }
379}
380
381#[derive(Debug, Clone, Serialize, Deserialize)]
383#[serde(rename_all = "camelCase")]
384pub struct TransactionEvent {
385 pub event_time: DateTime<Utc>,
387 pub event_time_zone_offset: String,
389 #[serde(skip_serializing_if = "Option::is_none")]
391 pub record_time: Option<DateTime<Utc>>,
392 #[serde(rename = "eventID", skip_serializing_if = "Option::is_none")]
394 pub event_id: Option<String>,
395 #[serde(skip_serializing_if = "Option::is_none")]
397 pub error_declaration: Option<ErrorDeclaration>,
398
399 pub action: Action,
401 #[serde(rename = "parentID", skip_serializing_if = "Option::is_none")]
403 pub parent_id: Option<Epc>,
404 #[serde(skip_serializing_if = "Option::is_none")]
406 pub epc_list: Option<Vec<Epc>>,
407 #[serde(skip_serializing_if = "Option::is_none")]
409 pub quantity_list: Option<Vec<QuantityElement>>,
410
411 #[serde(skip_serializing_if = "Option::is_none")]
413 pub biz_step: Option<BizStep>,
414 #[serde(skip_serializing_if = "Option::is_none")]
416 pub disposition: Option<Disposition>,
417 #[serde(skip_serializing_if = "Option::is_none")]
419 pub read_point: Option<ReadPoint>,
420 #[serde(skip_serializing_if = "Option::is_none")]
422 pub biz_location: Option<BizLocation>,
423 #[serde(skip_serializing_if = "Option::is_none")]
425 pub biz_transaction_list: Option<Vec<BizTransaction>>,
426 #[serde(skip_serializing_if = "Option::is_none")]
428 pub source_list: Option<Vec<Source>>,
429 #[serde(skip_serializing_if = "Option::is_none")]
431 pub destination_list: Option<Vec<Destination>>,
432 #[serde(skip_serializing_if = "Option::is_none")]
434 pub sensor_element_list: Option<Vec<SensorElement>>,
435
436 #[serde(flatten)]
438 pub extensions: serde_json::Map<String, serde_json::Value>,
439}
440
441impl TransactionEvent {
442 #[must_use]
444 pub fn new(event_time: DateTime<Utc>, tz_offset: String, action: Action) -> Self {
445 Self {
446 event_time,
447 event_time_zone_offset: tz_offset,
448 record_time: None,
449 event_id: None,
450 error_declaration: None,
451 action,
452 parent_id: None,
453 epc_list: None,
454 quantity_list: None,
455 biz_step: None,
456 disposition: None,
457 read_point: None,
458 biz_location: None,
459 biz_transaction_list: None,
460 source_list: None,
461 destination_list: None,
462 sensor_element_list: None,
463 extensions: serde_json::Map::new(),
464 }
465 }
466}
467
468#[derive(Debug, Clone, Serialize, Deserialize)]
470#[serde(tag = "type")]
471pub enum EPCISEvent {
472 ObjectEvent(ObjectEvent),
474 AggregationEvent(AggregationEvent),
476 TransformationEvent(TransformationEvent),
478 AssociationEvent(AssociationEvent),
480 TransactionEvent(TransactionEvent),
482}