use crate::client::ClientAtBlock;
use crate::config::{Config, HashFor, Hasher};
use crate::error::OfflineClientAtBlockError;
use crate::metadata::{ArcMetadata, Metadata};
#[derive(Clone, Debug)]
pub struct OfflineClient<T: Config> {
config: T,
}
impl<T: Config> OfflineClient<T> {
pub fn new_with_config(config: T) -> Self {
OfflineClient { config }
}
pub fn at_block(
&self,
block_number: impl Into<u64>,
) -> Result<ClientAtBlock<T, OfflineClientAtBlockImpl<T>>, OfflineClientAtBlockError> {
let block_number = block_number.into();
let (spec_version, transaction_version) = self
.config
.spec_and_transaction_version_for_block_number(block_number)
.ok_or(OfflineClientAtBlockError::SpecVersionNotFound { block_number })?;
let metadata = self
.config
.metadata_for_spec_version(spec_version)
.ok_or(OfflineClientAtBlockError::MetadataNotFound { spec_version })?;
let genesis_hash = self.config.genesis_hash();
let hasher = <T::Hasher as Hasher>::new(&metadata);
let offline_client_at_block = OfflineClientAtBlockImpl {
metadata,
block_number,
genesis_hash,
spec_version,
hasher,
transaction_version,
};
Ok(ClientAtBlock::new(offline_client_at_block))
}
}
#[derive(Debug, Clone)]
pub struct OfflineClientAtBlockImpl<T: Config> {
metadata: ArcMetadata,
block_number: u64,
genesis_hash: Option<HashFor<T>>,
spec_version: u32,
hasher: T::Hasher,
transaction_version: u32,
}
#[doc(hidden)]
pub trait OfflineClientAtBlockT<T: Config>: Clone {
fn metadata_ref(&self) -> &Metadata;
fn metadata(&self) -> ArcMetadata;
fn block_number(&self) -> u64;
fn genesis_hash(&self) -> Option<HashFor<T>>;
fn spec_version(&self) -> u32;
fn hasher(&self) -> &T::Hasher;
fn transaction_version(&self) -> u32;
}
impl<T: Config> OfflineClientAtBlockT<T> for OfflineClientAtBlockImpl<T> {
fn metadata_ref(&self) -> &Metadata {
&self.metadata
}
fn metadata(&self) -> ArcMetadata {
self.metadata.clone()
}
fn block_number(&self) -> u64 {
self.block_number
}
fn genesis_hash(&self) -> Option<HashFor<T>> {
self.genesis_hash
}
fn spec_version(&self) -> u32 {
self.spec_version
}
fn transaction_version(&self) -> u32 {
self.transaction_version
}
fn hasher(&self) -> &T::Hasher {
&self.hasher
}
}