use std::{fmt, time::Duration};
use matrix_sdk_common::debug::DebugStructExt;
use ruma::{api::client::sync::sync_events, presence::PresenceState};
const DEFAULT_SYNC_TIMEOUT: Duration = Duration::from_secs(30);
#[derive(Clone, Default, Debug)]
pub enum SyncToken {
Specific(String),
NoToken,
#[default]
ReusePrevious,
}
impl<T> From<T> for SyncToken
where
T: Into<String>,
{
fn from(token: T) -> SyncToken {
SyncToken::Specific(token.into())
}
}
impl SyncToken {
pub fn from_optional_token(maybe_token: Option<String>) -> SyncToken {
match maybe_token {
Some(token) => SyncToken::Specific(token),
None => SyncToken::default(),
}
}
}
#[derive(Clone)]
pub struct SyncSettings {
pub(crate) filter: Option<Box<sync_events::v3::Filter>>,
pub(crate) timeout: Option<Duration>,
pub(crate) ignore_timeout_on_first_sync: bool,
pub(crate) token: SyncToken,
pub(crate) full_state: bool,
pub(crate) set_presence: PresenceState,
}
impl Default for SyncSettings {
fn default() -> Self {
Self::new()
}
}
#[cfg(not(tarpaulin_include))]
impl fmt::Debug for SyncSettings {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
let Self {
filter,
timeout,
ignore_timeout_on_first_sync,
token: _,
full_state,
set_presence,
} = self;
f.debug_struct("SyncSettings")
.maybe_field("filter", filter)
.maybe_field("timeout", timeout)
.field("ignore_timeout_on_first_sync", ignore_timeout_on_first_sync)
.field("full_state", full_state)
.field("set_presence", set_presence)
.finish()
}
}
impl SyncSettings {
#[must_use]
pub fn new() -> Self {
Self {
filter: None,
timeout: Some(DEFAULT_SYNC_TIMEOUT),
ignore_timeout_on_first_sync: false,
token: SyncToken::default(),
full_state: false,
set_presence: PresenceState::Online,
}
}
#[must_use]
pub fn token(mut self, token: impl Into<SyncToken>) -> Self {
self.token = token.into();
self
}
#[must_use]
pub fn timeout(mut self, timeout: Duration) -> Self {
self.timeout = Some(timeout);
self
}
#[must_use]
pub fn ignore_timeout_on_first_sync(mut self, ignore: bool) -> Self {
self.ignore_timeout_on_first_sync = ignore;
self
}
#[must_use]
pub fn filter(mut self, filter: sync_events::v3::Filter) -> Self {
self.filter = Some(Box::new(filter));
self
}
#[must_use]
pub fn full_state(mut self, full_state: bool) -> Self {
self.full_state = full_state;
self
}
#[must_use]
pub fn set_presence(mut self, presence: PresenceState) -> Self {
self.set_presence = presence;
self
}
}