essential-server 0.4.0

Declaritive constraint checking engine
Documentation
use essential_storage::Storage;
use essential_types::{predicate::Predicate, solution::Solution, PredicateAddress};
use std::{collections::HashMap, sync::Arc};

#[cfg_attr(feature = "tracing", tracing::instrument(skip_all, err))]
pub async fn read_contract_from_storage<S>(
    solution: &Solution,
    storage: &S,
) -> anyhow::Result<HashMap<PredicateAddress, Arc<Predicate>>>
where
    S: Storage,
{
    let mut contract: HashMap<_, _> = HashMap::new();
    for data in &solution.data {
        let address = data.predicate_to_solve.clone();
        match storage.get_predicate(&address).await {
            Ok(Some(predicate)) => {
                contract.insert(address, Arc::new(predicate));
            }
            Ok(None) => {
                anyhow::bail!(
                    "Failed to retrieve contract from storage. contract: {}, predicate: {}",
                    address.contract,
                    address.predicate
                );
            }
            Err(err) => {
                anyhow::bail!(
                    "Failed to retrieve contract from storage. contract: {}, predicate: {}. Error {}",
                    address.contract,
                    address.predicate,
                    err
                );
            }
        }
    }
    #[cfg(feature = "tracing")]
    tracing::trace!(count = contract.len());
    Ok(contract)
}