nostr_sdk/client/
builder.rs1use std::sync::Arc;
8
9use nostr::signer::{IntoNostrSigner, NostrSigner};
10use nostr_database::memory::MemoryDatabase;
11use nostr_database::{IntoNostrDatabase, NostrDatabase};
12use nostr_relay_pool::monitor::Monitor;
13use nostr_relay_pool::policy::AdmitPolicy;
14use nostr_relay_pool::transport::websocket::{
15 DefaultWebsocketTransport, IntoWebSocketTransport, WebSocketTransport,
16};
17
18use crate::client::options::ClientOptions;
19use crate::client::Client;
20
21#[derive(Debug, Clone)]
23pub struct ClientBuilder {
24 pub signer: Option<Arc<dyn NostrSigner>>,
26 pub websocket_transport: Arc<dyn WebSocketTransport>,
28 pub admit_policy: Option<Arc<dyn AdmitPolicy>>,
30 pub database: Arc<dyn NostrDatabase>,
32 pub monitor: Option<Monitor>,
34 pub opts: ClientOptions,
36}
37
38impl Default for ClientBuilder {
39 fn default() -> Self {
40 Self {
41 signer: None,
42 websocket_transport: Arc::new(DefaultWebsocketTransport),
43 admit_policy: None,
44 database: Arc::new(MemoryDatabase::default()),
45 monitor: None,
46 opts: ClientOptions::default(),
47 }
48 }
49}
50
51impl ClientBuilder {
52 #[inline]
54 pub fn new() -> Self {
55 Self::default()
56 }
57
58 #[inline]
69 pub fn signer<T>(mut self, signer: T) -> Self
70 where
71 T: IntoNostrSigner,
72 {
73 self.signer = Some(signer.into_nostr_signer());
74 self
75 }
76
77 #[inline]
81 pub fn websocket_transport<T>(mut self, transport: T) -> Self
82 where
83 T: IntoWebSocketTransport,
84 {
85 self.websocket_transport = transport.into_transport();
86 self
87 }
88
89 #[inline]
91 pub fn admit_policy<T>(mut self, policy: T) -> Self
92 where
93 T: AdmitPolicy + 'static,
94 {
95 self.admit_policy = Some(Arc::new(policy));
96 self
97 }
98
99 #[inline]
101 pub fn database<D>(mut self, database: D) -> Self
102 where
103 D: IntoNostrDatabase,
104 {
105 self.database = database.into_nostr_database();
106 self
107 }
108
109 #[inline]
111 pub fn monitor(mut self, monitor: Monitor) -> Self {
112 self.monitor = Some(monitor);
113 self
114 }
115
116 #[inline]
118 pub fn opts(mut self, opts: ClientOptions) -> Self {
119 self.opts = opts;
120 self
121 }
122
123 #[inline]
125 pub fn build(self) -> Client {
126 Client::from_builder(self)
127 }
128}