use crate::BoxFuture;
use crate::peer::PeerRef;
use crate::types::{DcOption, PeerId, PeerInfo, UpdateState, UpdatesState};
pub type ErasedSession = dyn Session<Error = Box<dyn std::error::Error + Send + Sync + 'static>>;
pub trait Session: Send + Sync + 'static {
type Error;
fn home_dc_id(&self) -> Result<i32, Self::Error>;
fn set_home_dc_id(&self, dc_id: i32) -> BoxFuture<'_, Result<(), Self::Error>>;
fn dc_option(&self, dc_id: i32) -> Result<Option<DcOption>, Self::Error>;
fn set_dc_option(&self, dc_option: &DcOption) -> BoxFuture<'_, Result<(), Self::Error>>;
fn peer(&self, peer: PeerId) -> BoxFuture<'_, Result<Option<PeerInfo>, Self::Error>>;
fn peer_ref(&self, peer: PeerId) -> BoxFuture<'_, Result<Option<PeerRef>, Self::Error>> {
Box::pin(async move {
Ok(self
.peer(peer)
.await?
.and_then(|info| info.auth())
.map(|auth| PeerRef { id: peer, auth }))
})
}
fn cache_peer(&self, peer: &PeerInfo) -> BoxFuture<'_, Result<(), Self::Error>>;
fn updates_state(&self) -> BoxFuture<'_, Result<UpdatesState, Self::Error>>;
fn set_update_state(&self, update: UpdateState) -> BoxFuture<'_, Result<(), Self::Error>>;
}