use std::collections::{BTreeMap, BTreeSet};
use std::error::Error;
use amplify::confinement::TinyOrdSet;
use commit_verify::mpc;
use rgb::{
Anchor, AnchorId, BundleId, ContractId, Extension, Genesis, OpId, SchemaId, TransitionBundle,
};
use strict_encoding::TypeName;
use crate::interface::{ContractSuppl, Iface, IfaceId, SchemaIfaces};
#[derive(Debug, Display, Error, From)]
#[display(inner)]
pub enum StashError<E: Error> {
Connectivity(E),
#[from]
InternalInconsistency(StashInconsistency),
}
#[derive(Debug, Display, Error, From)]
#[display(doc_comments)]
pub enum StashInconsistency {
IfaceNameAbsent(TypeName),
IfaceAbsent(IfaceId),
ContractAbsent(ContractId),
SchemaAbsent(SchemaId),
IfaceImplAbsent(IfaceId, SchemaId),
OperationAbsent(OpId),
AnchorAbsent(AnchorId),
BundleAbsent(BundleId),
}
pub trait Stash {
type Error: Error;
fn schema_ids(&self) -> Result<BTreeSet<SchemaId>, Self::Error>;
fn ifaces(&self) -> Result<BTreeMap<IfaceId, TypeName>, Self::Error>;
fn iface_by_name(&self, name: &TypeName) -> Result<&Iface, StashError<Self::Error>>;
fn iface_by_id(&self, id: IfaceId) -> Result<&Iface, StashError<Self::Error>>;
fn schema(&self, schema_id: SchemaId) -> Result<&SchemaIfaces, StashError<Self::Error>>;
fn contract_ids(&self) -> Result<BTreeSet<ContractId>, Self::Error>;
fn contract_ids_by_iface(&self, name: &TypeName) -> Result<BTreeSet<ContractId>, Self::Error>;
fn contract_schema(
&self,
contract_id: ContractId,
) -> Result<&SchemaIfaces, StashError<Self::Error>> {
let genesis = self.genesis(contract_id)?;
self.schema(genesis.schema_id)
}
fn contract_suppl(&self, contract_id: ContractId) -> Option<&TinyOrdSet<ContractSuppl>>;
fn genesis(&self, contract_id: ContractId) -> Result<&Genesis, StashError<Self::Error>>;
fn bundle_ids(&self) -> Result<BTreeSet<BundleId>, Self::Error>;
fn bundle(&self, bundle_id: BundleId) -> Result<&TransitionBundle, StashError<Self::Error>>;
fn extension_ids(&self) -> Result<BTreeSet<OpId>, Self::Error>;
fn extension(&self, op_id: OpId) -> Result<&Extension, StashError<Self::Error>>;
fn anchor_ids(&self) -> Result<BTreeSet<AnchorId>, Self::Error>;
fn anchor(
&self,
anchor_id: AnchorId,
) -> Result<&Anchor<mpc::MerkleBlock>, StashError<Self::Error>>;
}