use std::sync::Arc;
use celestia_rpc::ShareClient;
use crate::Result;
use crate::api::share::{GetRangeResponse, GetRowResponse, SampleCoordinates};
use crate::client::ClientInner;
use crate::types::nmt::Namespace;
use crate::types::row_namespace_data::NamespaceData;
use crate::types::sample::Sample;
use crate::types::{ExtendedDataSquare, Share};
pub struct ShareApi {
inner: Arc<ClientInner>,
}
impl ShareApi {
pub(crate) fn new(inner: Arc<ClientInner>) -> ShareApi {
ShareApi { inner }
}
pub async fn shares_available(&self, height: u64) -> Result<()> {
Ok(self.inner.rpc.share_shares_available(height).await?)
}
pub async fn get(&self, height: u64, row: u64, column: u64) -> Result<Share> {
let header = self.inner.get_header_validated(height).await?;
Ok(self.inner.rpc.share_get_share(&header, row, column).await?)
}
pub async fn get_samples<I, C>(&self, height: u64, coordinates: I) -> Result<Vec<Sample>>
where
I: IntoIterator<Item = C>,
C: Into<SampleCoordinates>,
{
let header = self.inner.get_header_validated(height).await?;
Ok(self
.inner
.rpc
.share_get_samples(&header, coordinates)
.await?)
}
pub async fn get_eds(&self, height: u64) -> Result<ExtendedDataSquare> {
let header = self.inner.get_header_validated(height).await?;
Ok(self.inner.rpc.share_get_eds(&header).await?)
}
pub async fn get_row(&self, height: u64, row: u64) -> Result<GetRowResponse> {
let header = self.inner.get_header_validated(height).await?;
Ok(self.inner.rpc.share_get_row(&header, row).await?)
}
pub async fn get_namespace_data(
&self,
height: u64,
namespace: Namespace,
) -> Result<NamespaceData> {
let header = self.inner.get_header_validated(height).await?;
Ok(self
.inner
.rpc
.share_get_namespace_data(&header, namespace)
.await?)
}
pub async fn get_range(&self, height: u64, start: u64, end: u64) -> Result<GetRangeResponse> {
let header = self.inner.get_header_validated(height).await?;
Ok(self.inner.rpc.share_get_range(&header, start, end).await?)
}
}
#[cfg(test)]
mod tests {
use super::*;
use crate::test_utils::{ensure_serializable, ensure_serializable_deserializable};
#[allow(dead_code)]
#[allow(unused_variables)]
#[allow(unreachable_code)]
#[allow(clippy::diverging_sub_expression)]
async fn enforce_serde_bounds() {
let api = ShareApi::new(unimplemented!());
let _: () = api.shares_available(0).await.unwrap();
let coordinates: Vec<SampleCoordinates> =
ensure_serializable_deserializable(unimplemented!());
ensure_serializable(api.get_samples(0, coordinates).await.unwrap());
ensure_serializable(api.get_eds(0).await.unwrap());
ensure_serializable_deserializable(api.get(0, 0, 0).await.unwrap());
ensure_serializable_deserializable(api.get_row(0, 0).await.unwrap());
let namespace = ensure_serializable_deserializable(unimplemented!());
ensure_serializable_deserializable(api.get_namespace_data(0, namespace).await.unwrap());
ensure_serializable_deserializable(api.get_range(0, 0, 0).await.unwrap());
}
}