routee_compass/plugin/output/default/uuid/
plugin.rs1use super::output_json_extensions::UUIDJsonExtensions;
2use crate::app::compass::CompassAppError;
3use crate::app::search::SearchAppResult;
4use crate::plugin::output::default::uuid::output_json_extensions::UUIDJsonField;
5use crate::plugin::output::{OutputPlugin, OutputPluginError};
6use kdam::Bar;
7use routee_compass_core::algorithm::search::SearchInstance;
8use routee_compass_core::util::fs::read_utils::read_raw_file;
9use std::path::Path;
10
11pub struct UUIDOutputPlugin {
12 uuids: Box<[String]>,
13 o_key: String,
14 d_key: String,
15}
16
17impl UUIDOutputPlugin {
18 pub fn from_file<P: AsRef<Path>>(filename: &P) -> Result<UUIDOutputPlugin, OutputPluginError> {
19 let uuids = read_raw_file(
20 filename,
21 |_idx, row| Ok(row),
22 Some(Bar::builder().desc("uuids")),
23 None,
24 )
25 .map_err(|e| {
26 OutputPluginError::BuildFailed(format!(
27 "failure reading UUID file {}: {}",
28 filename.as_ref().to_str().unwrap_or_default(),
29 e
30 ))
31 })?;
32 eprintln!();
33
34 let o_key = UUIDJsonField::OriginVertexUUID.to_string();
35 let d_key = UUIDJsonField::DestinationVertexUUID.to_string();
36 Ok(UUIDOutputPlugin {
37 uuids,
38 o_key,
39 d_key,
40 })
41 }
42}
43
44impl OutputPlugin for UUIDOutputPlugin {
45 fn process(
46 &self,
47 output: &mut serde_json::Value,
48 search_result: &Result<(SearchAppResult, SearchInstance), CompassAppError>,
49 ) -> Result<(), OutputPluginError> {
50 match search_result {
51 Err(_) => Ok(()),
52 Ok(_) => {
53 let (origin_vertex_id, destination_vertex_id) = output.get_od_vertex_ids()?;
54 let origin_uuid = self.uuids.get(origin_vertex_id.0).cloned().ok_or_else(|| {
55 OutputPluginError::OutputPluginFailed(format!(
56 "UUID lookup table missing vertex index {}",
57 origin_vertex_id.0
58 ))
59 })?;
60 let destination_uuid = self
61 .uuids
62 .get(destination_vertex_id.0)
63 .cloned()
64 .ok_or_else(|| {
65 OutputPluginError::OutputPluginFailed(format!(
66 "UUID lookup table missing vertex index {}",
67 destination_vertex_id.0
68 ))
69 })?;
70
71 output[&self.o_key] = serde_json::Value::String(origin_uuid);
72 output[&self.d_key] = serde_json::Value::String(destination_uuid);
73 Ok(())
74 }
75 }
76 }
77}