#![cfg(feature = "cache")]
use crate::{paths::{IBCPath, Tag}, get::*};
use eyre::Report;
use serde::{Deserialize, Serialize};
use std::{cmp::Ordering, collections::HashMap};
#[derive(Default, Deserialize, Serialize)]
pub struct RegistryCache {
paths: HashMap<String, IBCPath>,
}
impl RegistryCache {
pub async fn get_path(
&self,
chain_a: &str,
chain_b: &str,
) -> Result<Option<IBCPath>, Report> {
let path_name = match chain_a.cmp(chain_b) {
Ordering::Less => chain_a.to_string() + "-" + chain_b,
Ordering::Equal => return Ok(None),
Ordering::Greater => chain_b.to_string() + "-" + chain_a,
};
Ok(self.paths.get(&path_name).cloned())
}
pub async fn get_paths_filtered(&self, tag: Tag) -> Result<Vec<IBCPath>, Report> {
Ok(self
.paths
.iter()
.filter(|kv| match &tag {
Tag::Dex(d) => kv.1.channels[0].tags.dex.eq(d),
Tag::Preferred(p) => kv.1.channels[0].tags.preferred.eq(p),
Tag::Properties(p) => kv.1.channels[0].tags.properties.eq(p),
Tag::Status(s) => kv.1.channels[0].tags.status.eq(s),
})
.map(|kv| kv.1.to_owned())
.collect())
}
pub async fn try_new() -> Result<RegistryCache, Report> {
let path_names = list_paths().await?;
let mut paths = HashMap::<String, IBCPath>::default();
for pn in path_names {
let cn: Vec<&str> = pn.split('-').collect();
paths.insert(
pn.clone(),
get_path(cn[0], cn[1])
.await?
.expect("path returned None"),
);
}
Ok(RegistryCache { paths })
}
}