1use async_trait::async_trait;
5use iota_sdk_types::{CheckpointContents, ObjectId, TransactionDigest, Version};
6use iota_types::committee::{Committee, EpochId};
7use iota_types::digests::ChainIdentifier;
8use iota_types::effects::{TransactionEffects, TransactionEvents};
9use iota_types::messages_checkpoint::CertifiedCheckpointSummary;
10use iota_types::object::Object;
11use iota_types::transaction::Transaction;
12
13use crate::BoxError;
14
15#[cfg(feature = "native-grpc")]
16mod grpc;
17
18#[derive(Debug, thiserror::Error)]
20#[non_exhaustive]
21pub enum SourceError {
22 #[error("source request failed")]
24 Request {
25 #[source]
27 source: BoxError,
28 },
29 #[error("source returned an invalid response")]
31 InvalidResponse {
32 #[source]
34 source: BoxError,
35 },
36 #[error("source response is missing required data")]
38 MissingData {
39 #[source]
41 source: BoxError,
42 },
43}
44
45impl SourceError {
46 pub fn request(source: impl std::error::Error + Send + Sync + 'static) -> Self {
48 Self::Request {
49 source: Box::new(source),
50 }
51 }
52
53 pub fn invalid_response(source: impl std::error::Error + Send + Sync + 'static) -> Self {
55 Self::InvalidResponse {
56 source: Box::new(source),
57 }
58 }
59
60 pub fn missing_data(source: impl std::error::Error + Send + Sync + 'static) -> Self {
62 Self::MissingData {
63 source: Box::new(source),
64 }
65 }
66}
67
68#[derive(Clone, Debug)]
73pub struct SourceTransaction {
74 pub transaction: Transaction,
76 pub effects: TransactionEffects,
78 pub events: Option<TransactionEvents>,
80 pub checkpoint_sequence_number: u64,
82}
83
84#[derive(Clone, Debug)]
89pub struct SourceCheckpoint {
90 pub summary: CertifiedCheckpointSummary,
92 pub contents: CheckpointContents,
94}
95
96#[cfg_attr(target_arch = "wasm32", async_trait(?Send))]
102#[cfg_attr(not(target_arch = "wasm32"), async_trait)]
103pub trait Source {
104 async fn chain_identifier(&self) -> Result<ChainIdentifier, SourceError>;
106
107 async fn transaction(
109 &self,
110 transaction_digest: TransactionDigest,
111 ) -> Result<Option<SourceTransaction>, SourceError>;
112
113 async fn object(&self, object_id: ObjectId, version: Option<Version>) -> Result<Option<Object>, SourceError>;
115
116 async fn checkpoint(&self, sequence_number: u64) -> Result<Option<SourceCheckpoint>, SourceError>;
120
121 async fn committee(&self, epoch: EpochId) -> Result<Committee, SourceError>;
123
124 async fn current_epoch(&self) -> Result<Option<EpochId>, SourceError>;
126
127 async fn epoch_close_summary(&self, epoch: EpochId) -> Result<Option<CertifiedCheckpointSummary>, SourceError>;
129}