use gateway_common::utils::async_map::AsyncMap;
use std::sync::Arc;
use super::trie::Trie;
use crate::{handler::HandlerResource, route::trie::QueryResult};
pub struct PathRoute {
pub one_cache: AsyncMap<String, Arc<HandlerResource>>,
pub trie: Trie,
}
impl PathRoute {
pub async fn search(
&self,
path: &str,
) -> Option<(Arc<HandlerResource>, Option<Vec<(String, String)>>)> {
if let Some(resource) = self
.one_cache
.get(path.to_owned())
.await
.expect("one_cache get error")
{
Some((resource, None))
} else {
let QueryResult { resource, fields } = self.trie.search(path)?;
if fields.is_empty() {
let _ = self
.one_cache
.insert(path.to_owned(), resource.clone())
.await;
}
Some((
resource,
if fields.is_empty() {
None
} else {
Some(fields)
},
))
}
}
}