use alloy::{primitives::Address, providers::Provider};
use crate::{
error::{Error, Result},
identity::Identity,
networks::{Network, NetworkAddresses},
reputation::Reputation,
validation::Validation,
};
#[derive(Debug, Clone)]
pub struct Erc8004<P> {
provider: P,
identity_address: Option<Address>,
reputation_address: Option<Address>,
validation_address: Option<Address>,
}
impl<P: Provider> Erc8004<P> {
#[must_use]
pub const fn new(provider: P) -> Self {
Self {
provider,
identity_address: None,
reputation_address: None,
validation_address: None,
}
}
#[must_use]
pub const fn with_network(mut self, network: Network) -> Self {
let addrs = network.addresses();
self.identity_address = Some(addrs.identity);
self.reputation_address = Some(addrs.reputation);
self
}
#[must_use]
pub const fn with_addresses(mut self, addrs: NetworkAddresses) -> Self {
self.identity_address = Some(addrs.identity);
self.reputation_address = Some(addrs.reputation);
self
}
#[must_use]
pub const fn with_identity_address(mut self, address: Address) -> Self {
self.identity_address = Some(address);
self
}
#[must_use]
pub const fn with_reputation_address(mut self, address: Address) -> Self {
self.reputation_address = Some(address);
self
}
#[must_use]
pub const fn with_validation_address(mut self, address: Address) -> Self {
self.validation_address = Some(address);
self
}
pub fn identity(&self) -> Result<Identity<&P>> {
let address = self.identity_address.ok_or(Error::RegistryNotConfigured {
registry: "identity",
})?;
Ok(Identity::new(&self.provider, address))
}
pub fn reputation(&self) -> Result<Reputation<&P>> {
let address = self
.reputation_address
.ok_or(Error::RegistryNotConfigured {
registry: "reputation",
})?;
Ok(Reputation::new(&self.provider, address))
}
pub fn validation(&self) -> Result<Validation<&P>> {
let address = self
.validation_address
.ok_or(Error::RegistryNotConfigured {
registry: "validation",
})?;
Ok(Validation::new(&self.provider, address))
}
#[must_use]
pub const fn provider(&self) -> &P {
&self.provider
}
#[must_use]
pub fn into_provider(self) -> P {
self.provider
}
#[must_use]
pub const fn identity_address(&self) -> Option<Address> {
self.identity_address
}
#[must_use]
pub const fn reputation_address(&self) -> Option<Address> {
self.reputation_address
}
#[must_use]
pub const fn validation_address(&self) -> Option<Address> {
self.validation_address
}
}