tp_lib_core/models/
detection_record.rs1use std::collections::BTreeMap;
8
9use chrono::{DateTime, FixedOffset};
10use serde::{Deserialize, Serialize};
11
12#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
14#[serde(rename_all = "lowercase")]
15pub enum DetectionKind {
16 Punctual,
17 Linear,
18}
19
20#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
22#[serde(untagged)]
23pub enum TimestampOrRange {
24 Single {
25 timestamp: DateTime<FixedOffset>,
26 },
27 Range {
28 t_from: DateTime<FixedOffset>,
29 t_to: DateTime<FixedOffset>,
30 },
31}
32
33#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
35#[serde(tag = "kind", rename_all = "snake_case")]
36pub enum DiscardReason {
37 OutOfTimeRange {
39 gnss_first: DateTime<FixedOffset>,
40 gnss_last: DateTime<FixedOffset>,
41 },
42 OutOfReach {
44 nearest_distance_m: f64,
45 cutoff_m: f64,
46 },
47 UnknownNetelement { netelement_id: String },
51 IntrinsicOutOfRange { value: f64 },
53 DuplicateOfPriorDetection { kept_index: usize },
55}
56
57#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
59#[serde(tag = "status", rename_all = "snake_case")]
60pub enum DetectionStatus {
61 Applied {
63 netelement_id: String,
64 intrinsic: f64,
65 },
66 Resolved {
69 netelement_id: String,
70 distance_m: f64,
71 },
72 Discarded { reason: DiscardReason },
74}
75
76#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
78pub struct DetectionRecord {
79 pub source_file: String,
80 pub source_row: usize,
81 pub kind: DetectionKind,
82 pub timestamp: TimestampOrRange,
83 pub status: DetectionStatus,
84 pub id: Option<String>,
85 pub source: Option<String>,
86 #[serde(default, skip_serializing_if = "BTreeMap::is_empty")]
87 pub metadata: BTreeMap<String, String>,
88}