1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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)
                },
            ))
        }
    }
}