From 086b00a9be055a2d1afcc3ff8eaba6ebc5d1d259 Mon Sep 17 00:00:00 2001 From: Zhang Jingqiang Date: Mon, 11 Sep 2023 16:24:36 +0800 Subject: [PATCH] simplify code --- g3proxy/src/config/auth/site/yaml.rs | 26 ++++-------- g3proxy/src/config/escaper/direct_fixed.rs | 24 ++++------- .../proxy_float/source/redis_cluster.rs | 27 +++---------- g3proxy/src/config/escaper/proxy_http.rs | 20 +++------- g3proxy/src/config/escaper/proxy_https.rs | 20 +++------- g3proxy/src/config/escaper/proxy_socks5.rs | 20 +++------- g3proxy/src/config/escaper/route_geoip.rs | 9 ++--- g3proxy/src/config/escaper/route_select.rs | 24 ++++------- g3proxy/src/config/server/tcp_stream.rs | 19 +++------ g3proxy/src/config/server/tls_stream.rs | 19 +++------ .../src/config/server/openssl_proxy/host.rs | 40 ++++++------------- .../config/server/openssl_proxy/service.rs | 16 ++------ .../src/config/server/rustls_proxy/host.rs | 15 ++----- .../src/config/server/rustls_proxy/service.rs | 16 ++------ lib/g3-yaml/src/hash.rs | 17 -------- lib/g3-yaml/src/lib.rs | 3 +- 16 files changed, 85 insertions(+), 230 deletions(-) diff --git a/g3proxy/src/config/auth/site/yaml.rs b/g3proxy/src/config/auth/site/yaml.rs index db50ab1f..35c95b83 100644 --- a/g3proxy/src/config/auth/site/yaml.rs +++ b/g3proxy/src/config/auth/site/yaml.rs @@ -39,36 +39,24 @@ impl UserSiteConfig { Ok(()) } "exact_match" => { - if let Yaml::Array(seq) = v { - for (i, v) in seq.iter().enumerate() { - let host = g3_yaml::value::as_host(v) - .context(format!("invalid host value for {k}#{i}"))?; - self.add_exact_host(host); - } - } else { - let host = g3_yaml::value::as_host(v) - .context(format!("invalid host value(s) for key {k}"))?; + let hosts = g3_yaml::value::as_list(v, g3_yaml::value::as_host) + .context(format!("invalid host list value for key {k}"))?; + for host in hosts { self.add_exact_host(host); } Ok(()) } "subnet_match" => { - let nets = g3_yaml::foreach_maybe_list_v(v, g3_yaml::value::as_ip_network)?; + let nets = g3_yaml::value::as_list(v, g3_yaml::value::as_ip_network)?; for net in nets { self.subnet_match_ipaddr.insert(net); } Ok(()) } "child_match" => { - if let Yaml::Array(seq) = v { - for (i, v) in seq.iter().enumerate() { - let domain = g3_yaml::value::as_domain(v) - .context(format!("invalid domain value for {k}#{i}"))?; - self.child_match_domain.insert(domain); - } - } else { - let domain = g3_yaml::value::as_domain(v) - .context(format!("invalid domain value(s) for key {k}"))?; + let domains = g3_yaml::value::as_list(v, g3_yaml::value::as_domain) + .context(format!("invalid domain list value for key {k}"))?; + for domain in domains { self.child_match_domain.insert(domain); } Ok(()) diff --git a/g3proxy/src/config/escaper/direct_fixed.rs b/g3proxy/src/config/escaper/direct_fixed.rs index 990088d7..3668f74c 100644 --- a/g3proxy/src/config/escaper/direct_fixed.rs +++ b/g3proxy/src/config/escaper/direct_fixed.rs @@ -15,7 +15,6 @@ */ use std::net::IpAddr; -use std::str::FromStr; use std::sync::Arc; use anyhow::{anyhow, Context}; @@ -108,20 +107,14 @@ impl DirectFixedEscaperConfig { self.extra_metrics_tags = Some(Arc::new(tags)); Ok(()) } - "bind_ip" => match v { - Yaml::String(ip) => self.add_bind_address(ip), - Yaml::Array(seq) => { - for (i, ip) in seq.iter().enumerate() { - if let Yaml::String(ip) = ip { - self.add_bind_address(ip)?; - } else { - return Err(anyhow!("invalid string value for {k}#{i}")); - } - } - Ok(()) + "bind_ip" => { + let ips = g3_yaml::value::as_list(v, g3_yaml::value::as_ipaddr) + .context(format!("invalid ip address list value for key {k}"))?; + for ip in ips { + self.add_bind_address(ip)?; } - _ => Err(anyhow!("invalid value type for key {k}")), - }, + Ok(()) + } "resolver" => { self.resolver = g3_yaml::value::as_metrics_name(v)?; Ok(()) @@ -218,8 +211,7 @@ impl DirectFixedEscaperConfig { Ok(()) } - fn add_bind_address(&mut self, ip: &str) -> anyhow::Result<()> { - let ip = IpAddr::from_str(ip)?; + fn add_bind_address(&mut self, ip: IpAddr) -> anyhow::Result<()> { match ip { IpAddr::V4(_) => self.bind4.push(ip), IpAddr::V6(_) => self.bind6.push(ip), diff --git a/g3proxy/src/config/escaper/proxy_float/source/redis_cluster.rs b/g3proxy/src/config/escaper/proxy_float/source/redis_cluster.rs index 480931d9..9ecf010f 100644 --- a/g3proxy/src/config/escaper/proxy_float/source/redis_cluster.rs +++ b/g3proxy/src/config/escaper/proxy_float/source/redis_cluster.rs @@ -14,7 +14,6 @@ * limitations under the License. */ -use std::str::FromStr; use std::time::Duration; use anyhow::{anyhow, Context}; @@ -69,20 +68,12 @@ impl ProxyFloatRedisClusterSource { fn set(&mut self, k: &str, v: &Yaml) -> anyhow::Result<()> { match g3_yaml::key::normalize(k).as_str() { super::CONFIG_KEY_SOURCE_TYPE => Ok(()), - "initial_nodes" | "startup_nodes" => match v { - Yaml::String(addr) => self.add_initial_node(addr), - Yaml::Array(seq) => { - for (i, v) in seq.iter().enumerate() { - if let Yaml::String(addr) = v { - self.add_initial_node(addr)?; - } else { - return Err(anyhow!("invalid string value for {k}#{i}")); - } - } - Ok(()) - } - _ => Err(anyhow!("invalid value type for key {k}")), - }, + "initial_nodes" | "startup_nodes" => { + self.initial_nodes = + g3_yaml::value::as_list(v, |v| g3_yaml::value::as_upstream_addr(v, 0)) + .context(format!("invalid upstream addr list value for key {k}"))?; + Ok(()) + } "username" => { let username = g3_yaml::value::as_string(v)?; self.username = Some(username); @@ -110,10 +101,4 @@ impl ProxyFloatRedisClusterSource { _ => Err(anyhow!("invalid key {k}")), } } - - fn add_initial_node(&mut self, addr: &str) -> anyhow::Result<()> { - let upstream = UpstreamAddr::from_str(addr)?; - self.initial_nodes.push(upstream); - Ok(()) - } } diff --git a/g3proxy/src/config/escaper/proxy_http.rs b/g3proxy/src/config/escaper/proxy_http.rs index 76523289..5d7470ad 100644 --- a/g3proxy/src/config/escaper/proxy_http.rs +++ b/g3proxy/src/config/escaper/proxy_http.rs @@ -125,20 +125,12 @@ impl ProxyHttpEscaperConfig { Ok(()) } "proxy_addr" => { - match v { - Yaml::String(_) => { - let node = g3_yaml::value::as_weighted_upstream_addr(v, 3128)?; - self.proxy_nodes.push(node); - } - Yaml::Array(seq) => { - for (i, v) in seq.iter().enumerate() { - let node = g3_yaml::value::as_weighted_upstream_addr(v, 3128) - .context(format!("invalid value for {k}#{i}"))?; - self.proxy_nodes.push(node); - } - } - _ => return Err(anyhow!("invalid value type for key {k}")), - } + self.proxy_nodes = g3_yaml::value::as_list(v, |v| { + g3_yaml::value::as_weighted_upstream_addr(v, 3128) + }) + .context(format!( + "invalid weighted upstream address list value for key {k}" + ))?; Ok(()) } "proxy_addr_pick_policy" => { diff --git a/g3proxy/src/config/escaper/proxy_https.rs b/g3proxy/src/config/escaper/proxy_https.rs index 1337e3c3..b52dcb40 100644 --- a/g3proxy/src/config/escaper/proxy_https.rs +++ b/g3proxy/src/config/escaper/proxy_https.rs @@ -129,20 +129,12 @@ impl ProxyHttpsEscaperConfig { Ok(()) } "proxy_addr" => { - match v { - Yaml::String(_) => { - let node = g3_yaml::value::as_weighted_upstream_addr(v, 3128)?; - self.proxy_nodes.push(node); - } - Yaml::Array(seq) => { - for (i, v) in seq.iter().enumerate() { - let node = g3_yaml::value::as_weighted_upstream_addr(v, 3128) - .context(format!("invalid value for {k}#{i}"))?; - self.proxy_nodes.push(node); - } - } - _ => return Err(anyhow!("invalid value type for key {k}")), - } + self.proxy_nodes = g3_yaml::value::as_list(v, |v| { + g3_yaml::value::as_weighted_upstream_addr(v, 3128) + }) + .context(format!( + "invalid weighted upstream address list value for key {k}" + ))?; Ok(()) } "proxy_addr_pick_policy" => { diff --git a/g3proxy/src/config/escaper/proxy_socks5.rs b/g3proxy/src/config/escaper/proxy_socks5.rs index ab0d28ac..86d5b08f 100644 --- a/g3proxy/src/config/escaper/proxy_socks5.rs +++ b/g3proxy/src/config/escaper/proxy_socks5.rs @@ -122,20 +122,12 @@ impl ProxySocks5EscaperConfig { Ok(()) } "proxy_addr" => { - match v { - Yaml::String(_) => { - let node = g3_yaml::value::as_weighted_upstream_addr(v, 1080)?; - self.proxy_nodes.push(node); - } - Yaml::Array(seq) => { - for (i, v) in seq.iter().enumerate() { - let node = g3_yaml::value::as_weighted_upstream_addr(v, 1080) - .context(format!("invalid value for {k}#{i}"))?; - self.proxy_nodes.push(node); - } - } - _ => return Err(anyhow!("invalid value type for key {k}")), - } + self.proxy_nodes = g3_yaml::value::as_list(v, |v| { + g3_yaml::value::as_weighted_upstream_addr(v, 1080) + }) + .context(format!( + "invalid weighted upstream address list value for key {k}" + ))?; Ok(()) } "proxy_addr_pick_policy" => { diff --git a/g3proxy/src/config/escaper/route_geoip.rs b/g3proxy/src/config/escaper/route_geoip.rs index a61420d4..e6212456 100644 --- a/g3proxy/src/config/escaper/route_geoip.rs +++ b/g3proxy/src/config/escaper/route_geoip.rs @@ -155,14 +155,14 @@ impl RouteGeoIpEscaperConfig { Ok(()) } "net" | "network" | "networks" => { - let nets = g3_yaml::foreach_maybe_list_v(v, g3_yaml::value::as_ip_network)?; + let nets = g3_yaml::value::as_list(v, g3_yaml::value::as_ip_network)?; for net in nets { networks.insert(net); } Ok(()) } "asn" | "as_number" | "as_numbers" => { - let all_as = g3_yaml::foreach_maybe_list_v(v, g3_yaml::value::as_u32)?; + let all_as = g3_yaml::value::as_list(v, g3_yaml::value::as_u32)?; for asn in all_as { asn_set.insert(asn); } @@ -170,15 +170,14 @@ impl RouteGeoIpEscaperConfig { } "country" | "countries" => { let all_countries = - g3_yaml::foreach_maybe_list_v(v, g3_yaml::value::as_iso_country_code)?; + g3_yaml::value::as_list(v, g3_yaml::value::as_iso_country_code)?; for country in all_countries { countries.insert(country); } Ok(()) } "continent" | "continents" => { - let all_continents = - g3_yaml::foreach_maybe_list_v(v, g3_yaml::value::as_continent_code)?; + let all_continents = g3_yaml::value::as_list(v, g3_yaml::value::as_continent_code)?; for continent in all_continents { continents.insert(continent); } diff --git a/g3proxy/src/config/escaper/route_select.rs b/g3proxy/src/config/escaper/route_select.rs index 95128588..5388983b 100644 --- a/g3proxy/src/config/escaper/route_select.rs +++ b/g3proxy/src/config/escaper/route_select.rs @@ -64,23 +64,13 @@ impl RouteSelectEscaperConfig { self.name = g3_yaml::value::as_metrics_name(v)?; Ok(()) } - "next_nodes" => match v { - Yaml::String(_) => { - let item = g3_yaml::value::as_weighted_metrics_name(v) - .context(format!("invalid weighted metrics name value for key {k}"))?; - self.next_nodes.push(item); - Ok(()) - } - Yaml::Array(seq) => { - for (i, v) in seq.iter().enumerate() { - let item = g3_yaml::value::as_weighted_metrics_name(v) - .context(format!("invalid weighted metrics name value for {k}#{i}"))?; - self.next_nodes.push(item); - } - Ok(()) - } - _ => Err(anyhow!("invalid value type for key {k}")), - }, + "next_nodes" => { + self.next_nodes = + g3_yaml::value::as_list(v, g3_yaml::value::as_weighted_metrics_name).context( + format!("invalid weighted metrics name list value for key {k}"), + )?; + Ok(()) + } "next_pick_policy" => { self.next_pick_policy = g3_yaml::value::as_selective_pick_policy(v) .context(format!("invalid selective pick policy value for key {k}"))?; diff --git a/g3proxy/src/config/server/tcp_stream.rs b/g3proxy/src/config/server/tcp_stream.rs index 89ac49ff..e6398b09 100644 --- a/g3proxy/src/config/server/tcp_stream.rs +++ b/g3proxy/src/config/server/tcp_stream.rs @@ -156,20 +156,11 @@ impl TcpStreamServerConfig { Ok(()) } "upstream" | "proxy_pass" => { - match v { - Yaml::String(_) => { - let node = g3_yaml::value::as_weighted_upstream_addr(v, 0)?; - self.upstream.push(node); - } - Yaml::Array(seq) => { - for (i, v) in seq.iter().enumerate() { - let node = g3_yaml::value::as_weighted_upstream_addr(v, 0) - .context(format!("invalid value for {k}#{i}"))?; - self.upstream.push(node); - } - } - _ => return Err(anyhow!("invalid value type for key {k}")), - } + self.upstream = + g3_yaml::value::as_list(v, |v| g3_yaml::value::as_weighted_upstream_addr(v, 0)) + .context(format!( + "invalid weighted upstream address value for key {k}" + ))?; Ok(()) } "upstream_pick_policy" => { diff --git a/g3proxy/src/config/server/tls_stream.rs b/g3proxy/src/config/server/tls_stream.rs index cb9b5423..ca1bf670 100644 --- a/g3proxy/src/config/server/tls_stream.rs +++ b/g3proxy/src/config/server/tls_stream.rs @@ -165,20 +165,11 @@ impl TlsStreamServerConfig { Ok(()) } "upstream" | "proxy_pass" => { - match v { - Yaml::String(_) => { - let node = g3_yaml::value::as_weighted_upstream_addr(v, 0)?; - self.upstream.push(node); - } - Yaml::Array(seq) => { - for (i, v) in seq.iter().enumerate() { - let node = g3_yaml::value::as_weighted_upstream_addr(v, 0) - .context(format!("invalid value for {k}#{i}"))?; - self.upstream.push(node); - } - } - _ => return Err(anyhow!("invalid value type for key {k}")), - } + self.upstream = + g3_yaml::value::as_list(v, |v| g3_yaml::value::as_weighted_upstream_addr(v, 0)) + .context(format!( + "invalid weighted upstream address list value for key {k}" + ))?; Ok(()) } "upstream_pick_policy" => { diff --git a/g3tiles/src/config/server/openssl_proxy/host.rs b/g3tiles/src/config/server/openssl_proxy/host.rs index 4cb7922e..3402e31d 100644 --- a/g3tiles/src/config/server/openssl_proxy/host.rs +++ b/g3tiles/src/config/server/openssl_proxy/host.rs @@ -258,39 +258,23 @@ impl YamlMapCallback for OpensslHostConfig { } "cert_pairs" => { let lookup_dir = g3_daemon::config::get_lookup_dir(doc)?; - if let Yaml::Array(seq) = value { - for (i, v) in seq.iter().enumerate() { - let pair = g3_yaml::value::as_openssl_certificate_pair(v, Some(lookup_dir)) - .context(format!("invalid openssl cert pair value for {key}#{i}"))?; - self.cert_pairs.push(pair); - } - } else { - let pair = g3_yaml::value::as_openssl_certificate_pair(value, Some(lookup_dir)) - .context(format!("invalid openssl cert pair value for key {key}"))?; - self.cert_pairs.push(pair); - } + self.cert_pairs = g3_yaml::value::as_list(value, |v| { + g3_yaml::value::as_openssl_certificate_pair(v, Some(lookup_dir)) + }) + .context(format!( + "invalid openssl cert pair list value for key {key}" + ))?; Ok(()) } #[cfg(feature = "vendored-tongsuo")] "tlcp_cert_pairs" => { let lookup_dir = g3_daemon::config::get_lookup_dir(doc)?; - if let Yaml::Array(seq) = value { - for (i, v) in seq.iter().enumerate() { - let pair = - g3_yaml::value::as_openssl_tlcp_certificate_pair(v, Some(lookup_dir)) - .context(format!( - "invalid openssl tlcp cert pair value for {key}#{i}" - ))?; - self.tlcp_cert_pairs.push(pair); - } - } else { - let pair = - g3_yaml::value::as_openssl_tlcp_certificate_pair(value, Some(lookup_dir)) - .context(format!( - "invalid openssl tlcp cert pair value for key {key}" - ))?; - self.tlcp_cert_pairs.push(pair); - } + self.tlcp_cert_pairs = g3_yaml::value::as_list(value, |v| { + g3_yaml::value::as_openssl_tlcp_certificate_pair(v, Some(lookup_dir)) + }) + .context(format!( + "invalid openssl tlcp cert pair list value for key {key}" + ))?; Ok(()) } "enable_client_auth" => { diff --git a/g3tiles/src/config/server/openssl_proxy/service.rs b/g3tiles/src/config/server/openssl_proxy/service.rs index f7b8e496..50860fe2 100644 --- a/g3tiles/src/config/server/openssl_proxy/service.rs +++ b/g3tiles/src/config/server/openssl_proxy/service.rs @@ -50,18 +50,10 @@ impl YamlMapCallback for OpensslServiceConfig { ) -> anyhow::Result<()> { match g3_yaml::key::normalize(key).as_str() { "addrs" => { - if let Yaml::Array(seq) = value { - for (i, v) in seq.iter().enumerate() { - let addr = g3_yaml::value::as_weighted_sockaddr(v).context(format!( - "invalid weighted sockaddr string value for {key}#{i}" - ))?; - self.addrs.push(addr); - } - } else { - let addr = g3_yaml::value::as_weighted_sockaddr(value) - .context(format!("invalid weighted sockaddr string value for {key}"))?; - self.addrs.push(addr); - } + self.addrs = g3_yaml::value::as_list(value, g3_yaml::value::as_weighted_sockaddr) + .context(format!( + "invalid weighted socket address list value for key {key}" + ))?; Ok(()) } "pick_policy" => { diff --git a/g3tiles/src/config/server/rustls_proxy/host.rs b/g3tiles/src/config/server/rustls_proxy/host.rs index 7529220f..8f669fe0 100644 --- a/g3tiles/src/config/server/rustls_proxy/host.rs +++ b/g3tiles/src/config/server/rustls_proxy/host.rs @@ -135,17 +135,10 @@ impl YamlMapCallback for RustlsHostConfig { } "cert_pairs" => { let lookup_dir = g3_daemon::config::get_lookup_dir(doc)?; - if let Yaml::Array(seq) = value { - for (i, v) in seq.iter().enumerate() { - let pair = g3_yaml::value::as_rustls_certificate_pair(v, Some(lookup_dir)) - .context(format!("invalid rustls cert pair value for {key}#{i}"))?; - self.cert_pairs.push(pair); - } - } else { - let pair = g3_yaml::value::as_rustls_certificate_pair(value, Some(lookup_dir)) - .context(format!("invalid rustls cert pair value for key {key}"))?; - self.cert_pairs.push(pair); - } + self.cert_pairs = g3_yaml::value::as_list(value, |v| { + g3_yaml::value::as_rustls_certificate_pair(v, Some(lookup_dir)) + }) + .context(format!("invalid rustls cert pair list value for key {key}"))?; Ok(()) } "enable_client_auth" => { diff --git a/g3tiles/src/config/server/rustls_proxy/service.rs b/g3tiles/src/config/server/rustls_proxy/service.rs index 73c0535e..2439675b 100644 --- a/g3tiles/src/config/server/rustls_proxy/service.rs +++ b/g3tiles/src/config/server/rustls_proxy/service.rs @@ -50,18 +50,10 @@ impl YamlMapCallback for RustlsServiceConfig { ) -> anyhow::Result<()> { match g3_yaml::key::normalize(key).as_str() { "addrs" => { - if let Yaml::Array(seq) = value { - for (i, v) in seq.iter().enumerate() { - let addr = g3_yaml::value::as_weighted_sockaddr(v).context(format!( - "invalid weighted sockaddr string value for {key}#{i}" - ))?; - self.addrs.push(addr); - } - } else { - let addr = g3_yaml::value::as_weighted_sockaddr(value) - .context(format!("invalid weighted sockaddr string value for {key}"))?; - self.addrs.push(addr); - } + self.addrs = g3_yaml::value::as_list(value, g3_yaml::value::as_weighted_sockaddr) + .context(format!( + "invalid weighted socket address list for key {key}" + ))?; Ok(()) } "pick_policy" => { diff --git a/lib/g3-yaml/src/hash.rs b/lib/g3-yaml/src/hash.rs index 2501e0f6..b885580e 100644 --- a/lib/g3-yaml/src/hash.rs +++ b/lib/g3-yaml/src/hash.rs @@ -31,23 +31,6 @@ where Ok(()) } -pub fn foreach_maybe_list_v(value: &Yaml, mut f: F) -> anyhow::Result> -where - F: FnMut(&Yaml) -> anyhow::Result, -{ - if let Yaml::Array(seq) = value { - let mut list = Vec::new(); - for (i, v) in seq.iter().enumerate() { - let r = f(v).context(format!("invalid value for array index #{i}"))?; - list.push(r); - } - Ok(list) - } else { - let r = f(value)?; - Ok(vec![r]) - } -} - pub fn get_required<'a>(map: &'a yaml::Hash, k: &str) -> anyhow::Result<&'a Yaml> { let key = Yaml::String(k.to_owned()); match map.get(&key) { diff --git a/lib/g3-yaml/src/lib.rs b/lib/g3-yaml/src/lib.rs index e0c98024..887a112f 100644 --- a/lib/g3-yaml/src/lib.rs +++ b/lib/g3-yaml/src/lib.rs @@ -25,8 +25,7 @@ pub mod value; pub use callback::YamlMapCallback; pub use hash::{ - foreach_kv, foreach_maybe_list_v, get_required as hash_get_required, - get_required_str as hash_get_required_str, + foreach_kv, get_required as hash_get_required, get_required_str as hash_get_required_str, }; pub use hybrid::HybridParser; pub use util::{foreach_doc, load_doc, YamlDocPosition};