making cli parse code more ergonomic by remove some copy and unwrap (#347)

1. remove some unessesary copy in cli parse code of string
2. make some member function into non-member function to avoid taking the self reference.
3. use if let Some(..) instead of if xxx.is_some() to avoid copy and unwrap
This commit is contained in:
Jiangqiu Shen 2024-09-18 09:57:12 -04:00 committed by GitHub
parent 1b03223537
commit ac9cfa5040
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -291,15 +291,15 @@ struct Cli {
rust_i18n::i18n!("locales", fallback = "en"); rust_i18n::i18n!("locales", fallback = "en");
impl Cli { impl Cli {
fn parse_listeners(&self) -> Vec<String> { fn parse_listeners(no_listener: bool, listeners: Vec<String>) -> Vec<String> {
println!("parsing listeners: {:?}", self.listeners); println!("parsing listeners: {:?}", listeners);
let proto_port_offset = vec![("tcp", 0), ("udp", 0), ("wg", 1), ("ws", 1), ("wss", 2)]; let proto_port_offset = vec![("tcp", 0), ("udp", 0), ("wg", 1), ("ws", 1), ("wss", 2)];
if self.no_listener || self.listeners.is_empty() { if no_listener || listeners.is_empty() {
return vec![]; return vec![];
} }
let origin_listners = self.listeners.clone(); let origin_listners = listeners;
let mut listeners: Vec<String> = Vec::new(); let mut listeners: Vec<String> = Vec::new();
if origin_listners.len() == 1 { if origin_listners.len() == 1 {
if let Ok(port) = origin_listners[0].parse::<u16>() { if let Ok(port) = origin_listners[0].parse::<u16>() {
@ -344,8 +344,8 @@ impl Cli {
TcpSocket::new_v4().unwrap().bind(s).map(|_| s).ok() TcpSocket::new_v4().unwrap().bind(s).map(|_| s).ok()
} }
fn parse_rpc_portal(&self) -> SocketAddr { fn parse_rpc_portal(rpc_portal: String) -> SocketAddr {
if let Ok(port) = self.rpc_portal.parse::<u16>() { if let Ok(port) = rpc_portal.parse::<u16>() {
if port == 0 { if port == 0 {
// check tcp 15888 first // check tcp 15888 first
for i in 15888..15900 { for i in 15888..15900 {
@ -358,7 +358,7 @@ impl Cli {
return format!("0.0.0.0:{}", port).parse().unwrap(); return format!("0.0.0.0:{}", port).parse().unwrap();
} }
self.rpc_portal.parse().unwrap() rpc_portal.parse().unwrap()
} }
} }
@ -376,14 +376,10 @@ impl From<Cli> for TomlConfigLoader {
let cfg = TomlConfigLoader::default(); let cfg = TomlConfigLoader::default();
cfg.set_inst_name(cli.instance_name.clone());
cfg.set_hostname(cli.hostname.clone()); cfg.set_hostname(cli.hostname);
cfg.set_network_identity(NetworkIdentity::new( cfg.set_network_identity(NetworkIdentity::new(cli.network_name, cli.network_secret));
cli.network_name.clone(),
cli.network_secret.clone(),
));
cfg.set_dhcp(cli.dhcp); cfg.set_dhcp(cli.dhcp);
@ -408,7 +404,7 @@ impl From<Cli> for TomlConfigLoader {
); );
cfg.set_listeners( cfg.set_listeners(
cli.parse_listeners() Cli::parse_listeners(cli.no_listener, cli.listeners)
.into_iter() .into_iter()
.map(|s| s.parse().unwrap()) .map(|s| s.parse().unwrap())
.collect(), .collect(),
@ -422,21 +418,15 @@ impl From<Cli> for TomlConfigLoader {
); );
} }
cfg.set_rpc_portal(cli.parse_rpc_portal()); cfg.set_rpc_portal(Cli::parse_rpc_portal(cli.rpc_portal));
if cli.external_node.is_some() { if let Some(external_nodes) = cli.external_node {
let mut old_peers = cfg.get_peers(); let mut old_peers = cfg.get_peers();
old_peers.push(PeerConfig { old_peers.push(PeerConfig {
uri: cli uri: external_nodes
.external_node
.clone()
.unwrap()
.parse() .parse()
.with_context(|| { .with_context(|| {
format!( format!("failed to parse external node uri: {}", external_nodes)
"failed to parse external node uri: {}",
cli.external_node.unwrap()
)
}) })
.unwrap(), .unwrap(),
}); });
@ -445,7 +435,7 @@ impl From<Cli> for TomlConfigLoader {
if cli.console_log_level.is_some() { if cli.console_log_level.is_some() {
cfg.set_console_logger_config(ConsoleLoggerConfig { cfg.set_console_logger_config(ConsoleLoggerConfig {
level: cli.console_log_level.clone(), level: cli.console_log_level,
}); });
} }
@ -457,18 +447,12 @@ impl From<Cli> for TomlConfigLoader {
}); });
} }
if cli.vpn_portal.is_some() { cfg.set_inst_name(cli.instance_name);
let url: url::Url = cli
.vpn_portal if let Some(vpn_portal) = cli.vpn_portal {
.clone() let url: url::Url = vpn_portal
.unwrap()
.parse() .parse()
.with_context(|| { .with_context(|| format!("failed to parse vpn portal url: {}", vpn_portal))
format!(
"failed to parse vpn portal url: {}",
cli.vpn_portal.unwrap()
)
})
.unwrap(); .unwrap();
cfg.set_vpn_portal_config(VpnPortalConfig { cfg.set_vpn_portal_config(VpnPortalConfig {
client_cidr: url.path()[1..] client_cidr: url.path()[1..]
@ -489,11 +473,9 @@ impl From<Cli> for TomlConfigLoader {
}); });
} }
if cli.manual_routes.is_some() { if let Some(manual_routes) = cli.manual_routes {
cfg.set_routes(Some( cfg.set_routes(Some(
cli.manual_routes manual_routes
.clone()
.unwrap()
.iter() .iter()
.map(|s| { .map(|s| {
s.parse() s.parse()