@@ -4,22 +4,41 @@ use crate::*;
44impl Default for ServerData {
55 fn default ( ) -> Self {
66 Self {
7- config : ServerConfig :: new ( ) ,
7+ server_config : ServerConfigData :: default ( ) ,
88 hook : vec ! [ ] ,
99 task_panic : vec ! [ ] ,
1010 read_error : vec ! [ ] ,
1111 }
1212 }
1313}
1414
15+ /// Provides a default implementation for ServerControlHook.
16+ impl Default for ServerControlHook {
17+ fn default ( ) -> Self {
18+ Self {
19+ wait_hook : Arc :: new ( || Box :: pin ( async { } ) ) ,
20+ shutdown_hook : Arc :: new ( || Box :: pin ( async { } ) ) ,
21+ }
22+ }
23+ }
24+
1525impl ServerData {
1626 /// Gets a reference to the configuration.
1727 ///
1828 /// # Returns
1929 ///
2030 /// - `&ServerConfig` - Reference to the configuration.
21- pub ( crate ) fn get_config ( & self ) -> & ServerConfig {
22- & self . config
31+ pub ( crate ) fn get_config ( & self ) -> & ServerConfigData {
32+ & self . server_config
33+ }
34+
35+ /// Gets a mutable reference to the server configuration.
36+ ///
37+ /// # Returns
38+ ///
39+ /// - `&mut ServerConfigData` - Mutable reference to the server configuration.
40+ pub ( crate ) fn get_mut_server_config ( & mut self ) -> & mut ServerConfigData {
41+ & mut self . server_config
2342 }
2443
2544 /// Gets a reference to the hook list.
@@ -113,6 +132,20 @@ impl Server {
113132 self . 0 . write ( ) . await
114133 }
115134
135+ /// Sets the server configuration.
136+ ///
137+ /// # Arguments
138+ ///
139+ /// - `ServerConfig` - The server configuration.
140+ ///
141+ /// # Returns
142+ ///
143+ /// - `&Self` - Reference to self for method chaining.
144+ pub async fn server_config ( & self , config : ServerConfig ) -> & Self {
145+ * self . write ( ) . await . get_mut_server_config ( ) = config. get_data ( ) . await ;
146+ self
147+ }
148+
116149 /// Constructs a bind address string from host and port。
117150 ///
118151 /// # Arguments
@@ -131,20 +164,6 @@ impl Server {
131164 format ! ( "{}{}{}" , host. as_ref( ) , COLON , port)
132165 }
133166
134- /// Adds a hook to the server's hook list.
135- ///
136- /// # Arguments
137- ///
138- /// - `ServerHookHandler` - The hook to add.
139- ///
140- /// # Returns
141- ///
142- /// - `&Self` - Reference to self for method chaining.
143- pub async fn handle ( & self , hook : ServerHookHandler ) -> & Self {
144- self . write ( ) . await . get_mut_hook ( ) . push ( hook) ;
145- self
146- }
147-
148167 /// Adds a typed hook to the server's hook list.
149168 ///
150169 /// # Arguments
@@ -158,7 +177,11 @@ impl Server {
158177 where
159178 H : ServerHook ,
160179 {
161- self . handle ( server_hook_factory :: < H > ( ) ) . await
180+ self . write ( )
181+ . await
182+ . get_mut_hook ( )
183+ . push ( server_hook_factory :: < H > ( ) ) ;
184+ self
162185 }
163186
164187 /// Adds a panic handler to the server's task panic handler list.
@@ -207,7 +230,7 @@ impl Server {
207230 ///
208231 /// - `Result<TcpListener, ServerError>` - The listener on success, or an error on failure.
209232 async fn create_tcp_listener ( & self ) -> Result < TcpListener , ServerError > {
210- let config: ServerConfigData = self . read ( ) . await . get_config ( ) . get_data ( ) . await ;
233+ let config: ServerConfigData = self . read ( ) . await . get_config ( ) . clone ( ) ;
211234 let host: String = config. host ;
212235 let port: u16 = config. port ;
213236 let addr: String = Self :: get_bind_addr ( & host, port) ;
@@ -225,7 +248,7 @@ impl Server {
225248 let server: Server = self . clone ( ) ;
226249 let hook: ServerHookList = self . read ( ) . await . get_hook ( ) . clone ( ) ;
227250 let task_panic: ServerHookList = self . read ( ) . await . get_task_panic ( ) . clone ( ) ;
228- let buffer_size: usize = self . read ( ) . await . get_config ( ) . get_data ( ) . await . buffer_size ;
251+ let buffer_size: usize = self . read ( ) . await . get_config ( ) . buffer_size ;
229252 spawn ( async move {
230253 server
231254 . handle_connection ( stream, hook, task_panic, buffer_size)
@@ -358,7 +381,6 @@ impl Server {
358381 let server: Server = self . clone ( ) ;
359382 let ( wait_sender, wait_receiver) = channel ( ( ) ) ;
360383 let ( shutdown_sender, mut shutdown_receiver) = channel ( ( ) ) ;
361-
362384 let accept_connections: JoinHandle < ( ) > = spawn ( async move {
363385 loop {
364386 tokio:: select! {
@@ -378,25 +400,21 @@ impl Server {
378400 }
379401 let _ = wait_sender. send ( ( ) ) ;
380402 } ) ;
381-
382403 let wait_hook = Arc :: new ( move || {
383404 let mut wait_receiver_clone = wait_receiver. clone ( ) ;
384405 Box :: pin ( async move {
385406 let _ = wait_receiver_clone. changed ( ) . await ;
386407 } ) as Pin < Box < dyn Future < Output = ( ) > + Send + ' static > >
387408 } ) ;
388-
389409 let shutdown_hook = Arc :: new ( move || {
390410 let shutdown_sender_clone: Sender < ( ) > = shutdown_sender. clone ( ) ;
391411 Box :: pin ( async move {
392412 let _ = shutdown_sender_clone. send ( ( ) ) ;
393413 } ) as Pin < Box < dyn Future < Output = ( ) > + Send + ' static > >
394414 } ) ;
395-
396415 spawn ( async move {
397416 let _ = accept_connections. await ;
398417 } ) ;
399-
400418 Ok ( ServerControlHook {
401419 wait_hook,
402420 shutdown_hook,
0 commit comments