Refactor response_classes and fix clippy issues
This commit is contained in:
		
							parent
							
								
									244a7073fe
								
							
						
					
					
						commit
						463bc99b9c
					
				
					 8 changed files with 139 additions and 133 deletions
				
			
		|  | @ -1,7 +1,8 @@ | |||
| use clap::{Parser, Subcommand, Args}; | ||||
| use telnet::Telnet; | ||||
| use crate::parameter::{Parameter, ParameterList}; | ||||
| use crate::response_classes::{ResponseChannel, ResponseClient}; | ||||
| use crate::response::channel::ResponseChannel; | ||||
| use crate::response::client::ResponseClient; | ||||
| use crate::utils; | ||||
| 
 | ||||
| #[derive(Parser)] | ||||
|  |  | |||
|  | @ -2,13 +2,13 @@ mod response; | |||
| mod utils; | ||||
| mod commands; | ||||
| mod parameter; | ||||
| mod response_classes; | ||||
| mod cli; | ||||
| 
 | ||||
| use std::process::exit; | ||||
| use telnet::Telnet; | ||||
| use crate::cli::Commands; | ||||
| use crate::response_classes::{ResponseChannel, ResponseClient}; | ||||
| use crate::response::channel::ResponseChannel; | ||||
| use crate::response::client::ResponseClient; | ||||
| 
 | ||||
| fn channel_or_exit(channel_res: Result<Option<ResponseChannel>, String>) -> ResponseChannel { | ||||
|     channel_res.unwrap_or_else(|err| { | ||||
|  |  | |||
|  | @ -18,7 +18,7 @@ pub fn parameter_find(params: &Vec<Parameter>, name: &str) -> Option<Parameter> | |||
| } | ||||
| pub fn parameter_list_find(param_lists: &Vec<ParameterList>, name: &str, value: &str, strict: bool) -> Option<ParameterList> { | ||||
|     for params in param_lists { | ||||
|         if params.iter().position(|param| param.is(name, value, strict)).is_some() { | ||||
|         if params.iter().any(|param| param.is(name, value, strict)) { | ||||
|             return Some(params.clone()); | ||||
|         } | ||||
|     } | ||||
|  | @ -27,7 +27,7 @@ pub fn parameter_list_find(param_lists: &Vec<ParameterList>, name: &str, value: | |||
| pub fn parameter_list_find_all(param_lists: &Vec<ParameterList>, name: &str, value: &str, strict: bool) -> Vec<ParameterList> { | ||||
|     let mut found = Vec::new(); | ||||
|     for params in param_lists { | ||||
|         if params.iter().position(|param| param.is(name, value, strict)).is_some() { | ||||
|         if params.iter().any(|param| param.is(name, value, strict)) { | ||||
|             found.push(params.clone()) | ||||
|         } | ||||
|     } | ||||
|  | @ -65,18 +65,16 @@ impl Parameter { | |||
| 
 | ||||
|     pub fn is(&self, name: &str, value: &str, strict: bool) -> bool { | ||||
|         if self.name != name { | ||||
|            false | ||||
|             return false; | ||||
|         } | ||||
|         else if self.value != value && strict { | ||||
|             false | ||||
|         if self.value != value && strict { | ||||
|             return false; | ||||
|         } | ||||
|         else if !self.value.contains(value) && !strict { | ||||
|             false | ||||
|         if !self.value.contains(value) && !strict { | ||||
|             return false; | ||||
|         } | ||||
|         else { | ||||
|         true | ||||
|     } | ||||
|     } | ||||
| 
 | ||||
|     pub fn to_i32(&self, default: i32) -> i32 { | ||||
|         self.value.parse::<i32>().unwrap_or(default) | ||||
|  |  | |||
|  | @ -1,3 +1,6 @@ | |||
| pub mod channel; | ||||
| pub mod client; | ||||
| 
 | ||||
| use std::fmt::{Debug, Display, Formatter}; | ||||
| use crate::parameter::*; | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										83
									
								
								src/response/channel.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										83
									
								
								src/response/channel.rs
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,83 @@ | |||
| use std::fmt::{Display, Formatter}; | ||||
| use crate::parameter::{parameter_find, ParameterList}; | ||||
| 
 | ||||
| #[derive(Debug)] | ||||
| pub struct ResponseChannel { | ||||
|     pub cid: i32, | ||||
|     pub pid: i32, | ||||
|     pub channel_order: i32, | ||||
|     pub channel_name: String, | ||||
|     pub channel_topic: String, | ||||
|     pub channel_flag_are_subscribed: bool, | ||||
| } | ||||
| 
 | ||||
| impl Display for ResponseChannel { | ||||
|     fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { | ||||
|         write!(f, "{} ({})", self.channel_name, self.cid) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl From<ParameterList> for ResponseChannel { | ||||
|     fn from(value: ParameterList) -> Self { | ||||
|         ResponseChannel { | ||||
|             cid: parameter_find(&value, "cid") | ||||
|                 .unwrap_or_default() | ||||
|                 .to_i32(-1), | ||||
|             pid: parameter_find(&value, "pid") | ||||
|                 .unwrap_or_default() | ||||
|                 .to_i32(-1), | ||||
|             channel_order: parameter_find(&value, "channel_order") | ||||
|                 .unwrap_or_default() | ||||
|                 .to_i32(-1), | ||||
|             channel_name: parameter_find(&value, "channel_name") | ||||
|                 .unwrap_or_default() | ||||
|                 .value, | ||||
|             channel_topic: parameter_find(&value, "channel_topic") | ||||
|                 .unwrap_or_default() | ||||
|                 .value, | ||||
|             channel_flag_are_subscribed: parameter_find(&value, "channel_flag_are_subscribed") | ||||
|                 .unwrap_or_default() | ||||
|                 .to_i32(0) == 1, | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl ResponseChannel { | ||||
|     pub fn is_spacer(&self) -> bool { | ||||
|         self.channel_name.starts_with("[spacer") | ||||
|             || self.channel_name.starts_with("[*spacer") | ||||
|             || self.channel_name.starts_with("[lspacer") | ||||
|             || self.channel_name.starts_with("[cspacer") | ||||
|             || self.channel_name.starts_with("[rspacer") | ||||
|     } | ||||
| 
 | ||||
|     fn list_find_next(list: &mut Vec<ResponseChannel>, order: i32, pid: i32) -> Option<ResponseChannel> { | ||||
|         let index = list.iter().position(|a| a.channel_order == order && a.pid == pid)?; | ||||
|         Some(list.swap_remove(index)) | ||||
|     } | ||||
| 
 | ||||
|     pub fn sort_list(mut list: Vec<ResponseChannel>) -> Vec<ResponseChannel> { | ||||
|         let mut list_sorted: Vec<ResponseChannel> = Vec::new(); | ||||
|         let mut pids: Vec<i32> = Vec::new(); | ||||
|         let mut pid = 0; | ||||
|         let mut order = 0; | ||||
| 
 | ||||
|         while !list.is_empty() { | ||||
|             match ResponseChannel::list_find_next(&mut list, order, pid) { | ||||
|                 None => { | ||||
|                     order = pid; | ||||
|                     pid = pids.pop().unwrap_or(0); | ||||
|                 } | ||||
|                 Some(elem) => { | ||||
|                     pids.push(pid); | ||||
|                     pid = elem.cid; | ||||
|                     order = 0; | ||||
|                     list_sorted.push(elem); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         list_sorted | ||||
|     } | ||||
| } | ||||
| 
 | ||||
							
								
								
									
										39
									
								
								src/response/client.rs
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										39
									
								
								src/response/client.rs
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,39 @@ | |||
| use std::fmt::{Display, Formatter}; | ||||
| use crate::parameter::{parameter_find, ParameterList}; | ||||
| 
 | ||||
| #[derive(Debug)] | ||||
| pub struct ResponseClient { | ||||
|     pub cid: i32, | ||||
|     pub clid: i32, | ||||
|     pub client_database_id: i32, | ||||
|     pub client_nickname: String, | ||||
|     pub client_type: i32, | ||||
| } | ||||
| 
 | ||||
| impl Display for ResponseClient { | ||||
|     fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { | ||||
|         write!(f, "{} ({})", self.client_nickname, self.clid) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl From<ParameterList> for ResponseClient { | ||||
|     fn from(value: ParameterList) -> Self { | ||||
|         ResponseClient { | ||||
|             cid: parameter_find(&value, "cid") | ||||
|                 .unwrap_or_default() | ||||
|                 .to_i32(-1), | ||||
|             clid: parameter_find(&value, "clid") | ||||
|                 .unwrap_or_default() | ||||
|                 .to_i32(-1), | ||||
|             client_database_id: parameter_find(&value, "client_database_id") | ||||
|                 .unwrap_or_default() | ||||
|                 .to_i32(-1), | ||||
|             client_nickname: parameter_find(&value, "client_nickname") | ||||
|                 .unwrap_or_default() | ||||
|                 .value, | ||||
|             client_type: parameter_find(&value, "channel_topic") | ||||
|                 .unwrap_or_default() | ||||
|                 .to_i32(0), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -1,119 +0,0 @@ | |||
| use std::fmt::{Display, Formatter}; | ||||
| use crate::parameter::{parameter_find, ParameterList}; | ||||
| 
 | ||||
| #[derive(Debug)] | ||||
| pub struct ResponseChannel { | ||||
|     pub cid: i32, | ||||
|     pub pid: i32, | ||||
|     pub channel_order: i32, | ||||
|     pub channel_name: String, | ||||
|     pub channel_topic: String, | ||||
|     pub channel_flag_are_subscribed: bool, | ||||
| } | ||||
| 
 | ||||
| impl Display for ResponseChannel { | ||||
|     fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { | ||||
|         write!(f, "{} ({})", self.channel_name, self.cid) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl From<ParameterList> for ResponseChannel { | ||||
|     fn from(value: ParameterList) -> Self { | ||||
|         ResponseChannel { | ||||
|             cid: parameter_find(&value, "cid") | ||||
|                 .unwrap_or_default() | ||||
|                 .to_i32(-1), | ||||
|             pid: parameter_find(&value, "pid") | ||||
|                 .unwrap_or_default() | ||||
|                 .to_i32(-1), | ||||
|             channel_order: parameter_find(&value, "channel_order") | ||||
|                 .unwrap_or_default() | ||||
|                 .to_i32(-1), | ||||
|             channel_name: parameter_find(&value, "channel_name") | ||||
|                 .unwrap_or_default() | ||||
|                 .value, | ||||
|             channel_topic: parameter_find(&value, "channel_topic") | ||||
|                 .unwrap_or_default() | ||||
|                 .value, | ||||
|             channel_flag_are_subscribed: parameter_find(&value, "channel_flag_are_subscribed") | ||||
|                 .unwrap_or_default() | ||||
|                 .to_i32(0) == 1, | ||||
|         } | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl ResponseChannel { | ||||
|     pub fn is_spacer(&self) -> bool { | ||||
|         self.channel_name.starts_with("[spacer") | ||||
|             || self.channel_name.starts_with("[*spacer") | ||||
|             || self.channel_name.starts_with("[lspacer") | ||||
|             || self.channel_name.starts_with("[cspacer") | ||||
|             || self.channel_name.starts_with("[rspacer") | ||||
|     } | ||||
| 
 | ||||
|     fn list_find_next(list: &mut Vec<ResponseChannel>, order: i32, pid: i32) -> Option<ResponseChannel> { | ||||
|         let index = list.iter().position(|a| a.channel_order == order && a.pid == pid)?; | ||||
|         Some(list.swap_remove(index)) | ||||
|     } | ||||
| 
 | ||||
|     pub fn sort_list(mut list: Vec<ResponseChannel>) -> Vec<ResponseChannel> { | ||||
|         let mut list_sorted: Vec<ResponseChannel> = Vec::new(); | ||||
|         let mut pids: Vec<i32> = Vec::new(); | ||||
|         let mut pid = 0; | ||||
|         let mut order = 0; | ||||
| 
 | ||||
|         while !list.is_empty() { | ||||
|             match ResponseChannel::list_find_next(&mut list, order, pid) { | ||||
|                 None => { | ||||
|                     order = pid; | ||||
|                     pid = pids.pop().unwrap_or(0); | ||||
|                 } | ||||
|                 Some(elem) => { | ||||
|                     pids.push(pid); | ||||
|                     pid = elem.cid; | ||||
|                     order = 0; | ||||
|                     list_sorted.push(elem); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         list_sorted | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug)] | ||||
| pub struct ResponseClient { | ||||
|     pub cid: i32, | ||||
|     pub clid: i32, | ||||
|     pub client_database_id: i32, | ||||
|     pub client_nickname: String, | ||||
|     pub client_type: i32, | ||||
| } | ||||
| 
 | ||||
| impl Display for ResponseClient { | ||||
|     fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { | ||||
|         write!(f, "{} ({})", self.client_nickname, self.clid) | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| impl From<ParameterList> for ResponseClient { | ||||
|     fn from(value: ParameterList) -> Self { | ||||
|         ResponseClient { | ||||
|             cid: parameter_find(&value, "cid") | ||||
|                 .unwrap_or_default() | ||||
|                 .to_i32(-1), | ||||
|             clid: parameter_find(&value, "clid") | ||||
|                 .unwrap_or_default() | ||||
|                 .to_i32(-1), | ||||
|             client_database_id: parameter_find(&value, "client_database_id") | ||||
|                 .unwrap_or_default() | ||||
|                 .to_i32(-1), | ||||
|             client_nickname: parameter_find(&value, "client_nickname") | ||||
|                 .unwrap_or_default() | ||||
|                 .value, | ||||
|             client_type: parameter_find(&value, "channel_topic") | ||||
|                 .unwrap_or_default() | ||||
|                 .to_i32(0), | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | @ -6,7 +6,8 @@ use telnet::Event::TimedOut; | |||
| use crate::{commands, parameter}; | ||||
| use crate::parameter::{parameter_list_find_all, ParameterList}; | ||||
| use crate::response::Response; | ||||
| use crate::response_classes::{ResponseChannel, ResponseClient}; | ||||
| use crate::response::channel::ResponseChannel; | ||||
| use crate::response::client::ResponseClient; | ||||
| 
 | ||||
| pub fn skip_welcome(connection: &mut Telnet) { | ||||
|     loop { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue