use std::sync::Arc;
use nostr::signer::{IntoNostrSigner, NostrSigner};
use nostr_database::memory::MemoryDatabase;
use nostr_database::{IntoNostrDatabase, NostrDatabase};
use nostr_gossip::{IntoNostrGossip, NostrGossip};
use nostr_relay_pool::monitor::Monitor;
use nostr_relay_pool::policy::AdmitPolicy;
use nostr_relay_pool::transport::websocket::{
DefaultWebsocketTransport, IntoWebSocketTransport, WebSocketTransport,
};
use crate::client::options::ClientOptions;
use crate::client::Client;
#[derive(Debug, Clone)]
pub struct ClientBuilder {
pub signer: Option<Arc<dyn NostrSigner>>,
pub websocket_transport: Arc<dyn WebSocketTransport>,
pub admit_policy: Option<Arc<dyn AdmitPolicy>>,
pub database: Arc<dyn NostrDatabase>,
pub gossip: Option<Arc<dyn NostrGossip>>,
pub monitor: Option<Monitor>,
pub opts: ClientOptions,
}
impl Default for ClientBuilder {
fn default() -> Self {
Self {
signer: None,
websocket_transport: Arc::new(DefaultWebsocketTransport),
admit_policy: None,
database: Arc::new(MemoryDatabase::default()),
gossip: None,
monitor: None,
opts: ClientOptions::default(),
}
}
}
impl ClientBuilder {
#[inline]
pub fn new() -> Self {
Self::default()
}
#[inline]
pub fn signer<T>(mut self, signer: T) -> Self
where
T: IntoNostrSigner,
{
self.signer = Some(signer.into_nostr_signer());
self
}
#[inline]
pub fn websocket_transport<T>(mut self, transport: T) -> Self
where
T: IntoWebSocketTransport,
{
self.websocket_transport = transport.into_transport();
self
}
#[inline]
pub fn admit_policy<T>(mut self, policy: T) -> Self
where
T: AdmitPolicy + 'static,
{
self.admit_policy = Some(Arc::new(policy));
self
}
#[inline]
pub fn database<D>(mut self, database: D) -> Self
where
D: IntoNostrDatabase,
{
self.database = database.into_nostr_database();
self
}
#[inline]
pub fn gossip<T>(mut self, gossip: T) -> Self
where
T: IntoNostrGossip,
{
self.gossip = Some(gossip.into_nostr_gossip());
self
}
#[inline]
pub fn monitor(mut self, monitor: Monitor) -> Self {
self.monitor = Some(monitor);
self
}
#[inline]
pub fn opts(mut self, opts: ClientOptions) -> Self {
self.opts = opts;
self
}
#[inline]
pub fn build(self) -> Client {
Client::from_builder(self)
}
}