use std::net::ToSocketAddrs;
use std::time::Duration;
use crate::feed::FeedPosition;
use crate::replica::ReplicaClient;
use crate::replica_error::ReplicaError;
#[cfg(feature = "secure")]
use crate::replica_secure::ReplicaSecurity;
#[derive(Debug, Clone)]
#[non_exhaustive]
pub struct ConnectOptions {
pub replica_id: String,
pub from: FeedPosition,
pub timeout: Duration,
#[cfg(feature = "secure")]
pub security: Option<ReplicaSecurity>,
}
impl ConnectOptions {
pub fn new(replica_id: impl Into<String>) -> Self {
ConnectOptions {
replica_id: replica_id.into(),
from: FeedPosition::default(),
timeout: Duration::from_secs(5),
#[cfg(feature = "secure")]
security: None,
}
}
#[must_use]
pub fn with_from(mut self, from: FeedPosition) -> Self {
self.from = from;
self
}
#[must_use]
pub fn with_timeout(mut self, timeout: Duration) -> Self {
self.timeout = timeout;
self
}
#[cfg(feature = "secure")]
#[must_use]
pub fn with_security(mut self, security: ReplicaSecurity) -> Self {
self.security = Some(security);
self
}
}
impl ReplicaClient {
pub fn connect_with<A: ToSocketAddrs>(
addr: A,
opts: &ConnectOptions,
) -> Result<Self, ReplicaError> {
#[cfg(feature = "secure")]
if let Some(security) = &opts.security {
return Self::connect_noise(addr, opts, security);
}
Self::connect_plain(addr, opts)
}
}