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

1use 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}