Refactor
This commit is contained in:
		
							
								
								
									
										70
									
								
								src/lib.rs
									
									
									
									
									
								
							
							
						
						
									
										70
									
								
								src/lib.rs
									
									
									
									
									
								
							| @@ -1,6 +1,6 @@ | |||||||
| use rand::distributions::{Alphanumeric, DistString}; | use rand::distributions::{Alphanumeric, DistString}; | ||||||
| use std::{ | use std::{ | ||||||
|     sync::mpsc::{channel, Sender}, |     sync::mpsc::{channel, Receiver, Sender}, | ||||||
|     thread::spawn, |     thread::spawn, | ||||||
| }; | }; | ||||||
|  |  | ||||||
| @@ -24,6 +24,46 @@ enum SendMsg { | |||||||
|     ValidateSess(ValidateSession), |     ValidateSess(ValidateSession), | ||||||
| } | } | ||||||
|  |  | ||||||
|  | struct Cache { | ||||||
|  |     data: Vec<String>, | ||||||
|  |     rx: Receiver<SendMsg>, | ||||||
|  | } | ||||||
|  |  | ||||||
|  | impl Cache { | ||||||
|  |     fn new(recv: Receiver<SendMsg>) -> Self { | ||||||
|  |         Self { | ||||||
|  |             rx: recv, | ||||||
|  |             data: Vec::new(), | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     fn gen_id(&self) -> String { | ||||||
|  |         Alphanumeric.sample_string(&mut rand::thread_rng(), 16) | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     fn listen(&mut self) { | ||||||
|  |         loop { | ||||||
|  |             match self.rx.recv().unwrap() { | ||||||
|  |                 SendMsg::ValidateSess(vsess) => { | ||||||
|  |                     vsess.tx.send(self.validate_session(vsess.id)).unwrap() | ||||||
|  |                 } | ||||||
|  |             } | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     fn validate_session(&mut self, sess: Option<String>) -> Session { | ||||||
|  |         let session: Session; | ||||||
|  |         if sess.is_some_and(|sess| self.data.contains(&sess)) { | ||||||
|  |             session = Session::Ok; | ||||||
|  |         } else { | ||||||
|  |             let id = self.gen_id(); | ||||||
|  |             self.data.push(id.clone()); | ||||||
|  |             session = Session::New(id); | ||||||
|  |         } | ||||||
|  |         session | ||||||
|  |     } | ||||||
|  | } | ||||||
|  |  | ||||||
| #[derive(Clone)] | #[derive(Clone)] | ||||||
| pub struct MoreThanText { | pub struct MoreThanText { | ||||||
|     tx: Sender<SendMsg>, |     tx: Sender<SendMsg>, | ||||||
| @@ -33,32 +73,8 @@ impl MoreThanText { | |||||||
|     pub fn new() -> Self { |     pub fn new() -> Self { | ||||||
|         let (tx, rx) = channel(); |         let (tx, rx) = channel(); | ||||||
|         spawn(move || { |         spawn(move || { | ||||||
|             let mut ids: Vec<String> = Vec::new(); |             let mut cache = Cache::new(rx); | ||||||
|             loop { |             cache.listen(); | ||||||
|                 match rx.recv().unwrap() { |  | ||||||
|                     SendMsg::ValidateSess(vsess) => { |  | ||||||
|                         let session: Session; |  | ||||||
|                         match vsess.id { |  | ||||||
|                             Some(id) => { |  | ||||||
|                                 if ids.contains(&id) { |  | ||||||
|                                     session = Session::Ok; |  | ||||||
|                                 } else { |  | ||||||
|                                     let sid = |  | ||||||
|                                         Alphanumeric.sample_string(&mut rand::thread_rng(), 16); |  | ||||||
|                                     ids.push(sid.clone()); |  | ||||||
|                                     session = Session::New(sid); |  | ||||||
|                                 } |  | ||||||
|                             } |  | ||||||
|                             None => { |  | ||||||
|                                 let sid = Alphanumeric.sample_string(&mut rand::thread_rng(), 16); |  | ||||||
|                                 ids.push(sid.clone()); |  | ||||||
|                                 session = Session::New(sid); |  | ||||||
|                             } |  | ||||||
|                         } |  | ||||||
|                         vsess.tx.send(session).unwrap(); |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             } |  | ||||||
|         }); |         }); | ||||||
|         Self { tx: tx } |         Self { tx: tx } | ||||||
|     } |     } | ||||||
|   | |||||||
| @@ -15,6 +15,9 @@ struct Args { | |||||||
|     /// IP used |     /// IP used | ||||||
|     #[arg(short, long, default_value_t = LOCALHOST.to_string())] |     #[arg(short, long, default_value_t = LOCALHOST.to_string())] | ||||||
|     address: String, |     address: String, | ||||||
|  |     /// cluster host | ||||||
|  |     #[arg(short, long, num_args(0..))] | ||||||
|  |     cluster: String, | ||||||
| } | } | ||||||
|  |  | ||||||
| #[cfg(test)] | #[cfg(test)] | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user