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