routee_compass/plugin/output/default/uuid/
output_json_extensions.rs

1use std::fmt::Display;
2
3use routee_compass_core::model::network::VertexId;
4
5use crate::plugin::{input::InputField, output::OutputPluginError};
6
7pub enum UUIDJsonField {
8    Request,
9    OriginVertexId,
10    DestinationVertexId,
11    OriginVertexUUID,
12    DestinationVertexUUID,
13}
14
15impl From<UUIDJsonField> for InputField {
16    fn from(value: UUIDJsonField) -> Self {
17        InputField::Custom(value.to_string())
18    }
19}
20
21impl UUIDJsonField {
22    pub fn as_str(&self) -> &'static str {
23        match self {
24            UUIDJsonField::Request => "request",
25            UUIDJsonField::OriginVertexId => "origin_vertex",
26            UUIDJsonField::DestinationVertexId => "destination_vertex",
27            UUIDJsonField::OriginVertexUUID => "origin_vertex_uuid",
28            UUIDJsonField::DestinationVertexUUID => "destination_vertex_uuid",
29        }
30    }
31}
32
33impl Display for UUIDJsonField {
34    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
35        write!(f, "{}", self.as_str())
36    }
37}
38
39pub trait UUIDJsonExtensions {
40    fn get_od_vertex_ids(&self) -> Result<(VertexId, VertexId), OutputPluginError>;
41    fn add_od_uuids(
42        &mut self,
43        origin_uuid: String,
44        destination_uuid: String,
45    ) -> Result<(), OutputPluginError>;
46}
47
48impl UUIDJsonExtensions for serde_json::Value {
49    fn get_od_vertex_ids(&self) -> Result<(VertexId, VertexId), OutputPluginError> {
50        let request = self
51            .get(UUIDJsonField::Request.as_str())
52            .ok_or_else(|| {
53                OutputPluginError::MissingExpectedQueryField(UUIDJsonField::Request.into())
54            })?
55            .as_object()
56            .ok_or_else(|| {
57                OutputPluginError::QueryFieldHasInvalidType(
58                    UUIDJsonField::Request.into(),
59                    String::from("json object"),
60                )
61            })?;
62
63        let origin_vertex_id = request
64            .get(&UUIDJsonField::OriginVertexId.to_string())
65            .ok_or_else(|| {
66                OutputPluginError::MissingExpectedQueryField(UUIDJsonField::OriginVertexId.into())
67            })?
68            .as_u64()
69            .ok_or_else(|| {
70                OutputPluginError::QueryFieldHasInvalidType(
71                    UUIDJsonField::OriginVertexId.into(),
72                    String::from("u64"),
73                )
74            })?;
75        let destination_vertex_id = request
76            .get(&UUIDJsonField::DestinationVertexId.to_string())
77            .ok_or_else(|| {
78                OutputPluginError::MissingExpectedQueryField(
79                    UUIDJsonField::DestinationVertexId.into(),
80                )
81            })?
82            .as_u64()
83            .ok_or_else(|| {
84                OutputPluginError::QueryFieldHasInvalidType(
85                    UUIDJsonField::DestinationVertexId.into(),
86                    String::from("u64"),
87                )
88            })?;
89        Ok((
90            VertexId(origin_vertex_id as usize),
91            VertexId(destination_vertex_id as usize),
92        ))
93    }
94    fn add_od_uuids(
95        &mut self,
96        origin_uuid: String,
97        destination_uuid: String,
98    ) -> Result<(), OutputPluginError> {
99        let request = self
100            .get_mut(UUIDJsonField::Request.as_str())
101            .ok_or_else(|| {
102                OutputPluginError::MissingExpectedQueryField(UUIDJsonField::Request.into())
103            })?
104            .as_object_mut()
105            .ok_or_else(|| {
106                OutputPluginError::QueryFieldHasInvalidType(
107                    UUIDJsonField::Request.into(),
108                    String::from("json object"),
109                )
110            })?;
111
112        request.insert(
113            UUIDJsonField::OriginVertexUUID.to_string(),
114            serde_json::Value::String(origin_uuid),
115        );
116        request.insert(
117            UUIDJsonField::DestinationVertexUUID.to_string(),
118            serde_json::Value::String(destination_uuid),
119        );
120        Ok(())
121    }
122}