gear_subxt/client/
offline_client.rs1use crate::{
6 blocks::BlocksClient, constants::ConstantsClient, events::EventsClient,
7 rpc::types::RuntimeVersion, runtime_api::RuntimeApiClient, storage::StorageClient,
8 tx::TxClient, Config, Metadata,
9};
10use derivative::Derivative;
11use std::sync::Arc;
12
13pub trait OfflineClientT<T: Config>: Clone + Send + Sync + 'static {
16 fn metadata(&self) -> Metadata;
18 fn genesis_hash(&self) -> T::Hash;
20 fn runtime_version(&self) -> RuntimeVersion;
22
23 fn tx(&self) -> TxClient<T, Self> {
25 TxClient::new(self.clone())
26 }
27
28 fn events(&self) -> EventsClient<T, Self> {
30 EventsClient::new(self.clone())
31 }
32
33 fn storage(&self) -> StorageClient<T, Self> {
35 StorageClient::new(self.clone())
36 }
37
38 fn constants(&self) -> ConstantsClient<T, Self> {
40 ConstantsClient::new(self.clone())
41 }
42
43 fn blocks(&self) -> BlocksClient<T, Self> {
45 BlocksClient::new(self.clone())
46 }
47
48 fn runtime_api(&self) -> RuntimeApiClient<T, Self> {
50 RuntimeApiClient::new(self.clone())
51 }
52}
53
54#[derive(Derivative)]
57#[derivative(Debug(bound = ""), Clone(bound = ""))]
58pub struct OfflineClient<T: Config> {
59 inner: Arc<Inner<T>>,
60}
61
62#[derive(Derivative)]
63#[derivative(Debug(bound = ""), Clone(bound = ""))]
64struct Inner<T: Config> {
65 genesis_hash: T::Hash,
66 runtime_version: RuntimeVersion,
67 metadata: Metadata,
68}
69
70impl<T: Config> OfflineClient<T> {
71 pub fn new(
74 genesis_hash: T::Hash,
75 runtime_version: RuntimeVersion,
76 metadata: impl Into<Metadata>,
77 ) -> OfflineClient<T> {
78 OfflineClient {
79 inner: Arc::new(Inner {
80 genesis_hash,
81 runtime_version,
82 metadata: metadata.into(),
83 }),
84 }
85 }
86
87 pub fn genesis_hash(&self) -> T::Hash {
89 self.inner.genesis_hash
90 }
91
92 pub fn runtime_version(&self) -> RuntimeVersion {
94 self.inner.runtime_version.clone()
95 }
96
97 pub fn metadata(&self) -> Metadata {
99 self.inner.metadata.clone()
100 }
101
102 pub fn tx(&self) -> TxClient<T, Self> {
107 <Self as OfflineClientT<T>>::tx(self)
108 }
109
110 pub fn events(&self) -> EventsClient<T, Self> {
112 <Self as OfflineClientT<T>>::events(self)
113 }
114
115 pub fn storage(&self) -> StorageClient<T, Self> {
117 <Self as OfflineClientT<T>>::storage(self)
118 }
119
120 pub fn constants(&self) -> ConstantsClient<T, Self> {
122 <Self as OfflineClientT<T>>::constants(self)
123 }
124}
125
126impl<T: Config> OfflineClientT<T> for OfflineClient<T> {
127 fn genesis_hash(&self) -> T::Hash {
128 self.genesis_hash()
129 }
130 fn runtime_version(&self) -> RuntimeVersion {
131 self.runtime_version()
132 }
133 fn metadata(&self) -> Metadata {
134 self.metadata()
135 }
136}
137
138impl<'a, T: Config> From<&'a OfflineClient<T>> for OfflineClient<T> {
143 fn from(c: &'a OfflineClient<T>) -> Self {
144 c.clone()
145 }
146}