use ipld_core::ipld::Ipld;
use crate::error::Error;
use crate::id::Cid;
use crate::objects::{IndexSet, Node};
use crate::prolly::{self, ProllyKey};
use crate::repo::readonly::decode_from_store;
use crate::store::Blockstore;
use super::build::prop_value_hash;
pub fn lookup_by_prop<B: Blockstore + ?Sized>(
bs: &B,
indexes: &IndexSet,
label: &str,
prop_name: &str,
value: &Ipld,
) -> Result<Option<(Cid, Node)>, Error> {
let Some(tree_root) = indexes
.nodes_by_prop
.get(label)
.and_then(|m| m.get(prop_name))
else {
return Ok(None);
};
let key = ProllyKey::new(prop_value_hash(value)?);
let Some(node_cid) = prolly::lookup(bs, tree_root, &key)? else {
return Ok(None);
};
let node: Node = decode_from_store(bs, &node_cid)?;
if node.ntype != label {
return Ok(None);
}
if node.props.get(prop_name) != Some(value) {
return Ok(None);
}
Ok(Some((node_cid, node)))
}