bonds_core/manager/
querying.rs1use super::*;
2
3impl BondManager {
5 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}