routee_compass/plugin/output/default/uuid/
output_json_extensions.rs1use 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}