Skip to main content

bonds_core/manager/
querying.rs

1use super::*;
2
3/// Query and filtering concerns.
4impl BondManager {
5    /// Query bonds using optional source/target/metadata filters (AND semantics).
6    pub fn query_bonds(&self, query: &BondQuery) -> Result<Vec<Bond>, BondError> {
7        let bonds = self.list_bonds()?;
8
9        let filtered = bonds
10            .into_iter()
11            .filter(|bond| {
12                if let Some(source) = query.source.as_ref()
13                    && bond.source() != source.as_path()
14                {
15                    return false;
16                }
17
18                if let Some(target) = query.target.as_ref()
19                    && bond.target() != target.as_path()
20                {
21                    return false;
22                }
23
24                if let Some(meta_filter) = query.metadata.as_ref() {
25                    let Some(metadata) = bond.metadata() else {
26                        return false;
27                    };
28
29                    match meta_filter {
30                        MetadataFilter::HasKey(key) => metadata.contains_key(key),
31                        MetadataFilter::KeyValue { key, value } => {
32                            metadata.get(key).map(|v| v.as_str()) == Some(value.as_str())
33                        }
34                    }
35                } else {
36                    true
37                }
38            })
39            .collect();
40
41        Ok(filtered)
42    }
43
44    pub fn query_by_source<P: AsRef<Path>>(&self, source: P) -> Result<Vec<Bond>, BondError> {
45        self.query_bonds(&BondQuery::new().with_source(source))
46    }
47
48    pub fn query_by_target<P: AsRef<Path>>(&self, target: P) -> Result<Vec<Bond>, BondError> {
49        self.query_bonds(&BondQuery::new().with_target(target))
50    }
51
52    pub fn query_by_metadata_key(&self, key: &str) -> Result<Vec<Bond>, BondError> {
53        self.query_bonds(&BondQuery::new().with_metadata_key(key))
54    }
55
56    pub fn query_by_metadata(&self, key: &str, value: &str) -> Result<Vec<Bond>, BondError> {
57        self.query_bonds(&BondQuery::new().with_metadata(key, value))
58    }
59}