diff --git a/Cargo.lock b/Cargo.lock index 4eddc7bc2..ea80f9216 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1705,6 +1705,15 @@ dependencies = [ "cc", ] +[[package]] +name = "ordered-float" +version = "5.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f59006ce1e204c30956638535b74d317bca99477b9356dfaec54c37f6f600ab" +dependencies = [ + "num-traits", +] + [[package]] name = "papergrid" version = "0.18.0" @@ -2170,6 +2179,28 @@ dependencies = [ "winapi-util", ] +[[package]] +name = "saphyr" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3aa37a62b2a28868277e83b6f651dc9581751db73d1cb51132c73c0b4ec7f70a" +dependencies = [ + "hashlink", + "ordered-float", + "saphyr-parser", + "thiserror", +] + +[[package]] +name = "saphyr-parser" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48cf5a82d41247a625f040af08e91008fec945bce3b0bffba992c44af092caa2" +dependencies = [ + "arraydeque", + "thiserror", +] + [[package]] name = "schannel" version = "0.1.30" @@ -2765,6 +2796,7 @@ dependencies = [ "anyhow", "log", "rmpv", + "saphyr", "tokio", "variant-ssl", "vey-io-ext", @@ -2772,7 +2804,6 @@ dependencies = [ "vey-socket", "vey-types", "vey-yaml", - "yaml-rust2", ] [[package]] @@ -2858,6 +2889,7 @@ dependencies = [ "rand", "rustc-hash", "rustix", + "saphyr", "serde_json", "slog", "smallvec", @@ -2882,7 +2914,6 @@ dependencies = [ "vey-syslog", "vey-types", "vey-yaml", - "yaml-rust2", ] [[package]] @@ -2905,6 +2936,7 @@ dependencies = [ "foldhash", "kanal", "log", + "saphyr", "snmalloc-rs", "tokio", "variant-ssl", @@ -2923,7 +2955,6 @@ dependencies = [ "vey-tls-cert", "vey-types", "vey-yaml", - "yaml-rust2", ] [[package]] @@ -2969,6 +3000,7 @@ dependencies = [ "log", "rmp", "rmp-serde", + "saphyr", "serde", "slog", "tokio", @@ -2979,7 +3011,6 @@ dependencies = [ "vey-socket", "vey-types", "vey-yaml", - "yaml-rust2", ] [[package]] @@ -2992,13 +3023,13 @@ dependencies = [ "log", "memchr", "mime", + "saphyr", "thiserror", "tokio", "vey-datetime", "vey-io-ext", "vey-types", "vey-yaml", - "yaml-rust2", ] [[package]] @@ -3027,6 +3058,7 @@ dependencies = [ "rustc-hash", "rustls", "rustls-pki-types", + "saphyr", "serde_json", "slog", "snmalloc-rs", @@ -3055,7 +3087,6 @@ dependencies = [ "vey-tls-ticket", "vey-types", "vey-yaml", - "yaml-rust2", ] [[package]] @@ -3186,6 +3217,7 @@ dependencies = [ "log", "memchr", "rustls-pki-types", + "saphyr", "thiserror", "tokio", "tokio-rustls", @@ -3197,7 +3229,6 @@ dependencies = [ "vey-socket", "vey-types", "vey-yaml", - "yaml-rust2", ] [[package]] @@ -3260,6 +3291,7 @@ dependencies = [ "log", "rmpv", "rustc-hash", + "saphyr", "tokio", "tokio-util", "vey-geoip-types", @@ -3267,7 +3299,6 @@ dependencies = [ "vey-socket", "vey-types", "vey-yaml", - "yaml-rust2", ] [[package]] @@ -3283,6 +3314,7 @@ dependencies = [ "foldhash", "ip_network_table", "log", + "saphyr", "snmalloc-rs", "tokio", "vey-build-env", @@ -3298,7 +3330,6 @@ dependencies = [ "vey-statsd-client", "vey-types", "vey-yaml", - "yaml-rust2", ] [[package]] @@ -3393,6 +3424,7 @@ dependencies = [ "jiff", "log", "openssl-probe", + "saphyr", "serde_json", "slog", "snmalloc-rs", @@ -3424,7 +3456,6 @@ dependencies = [ "vey-tls-ticket", "vey-types", "vey-yaml", - "yaml-rust2", ] [[package]] @@ -3573,6 +3604,7 @@ dependencies = [ "rmpv", "rustc-hash", "rustls", + "saphyr", "serde_json", "slog", "smallvec", @@ -3623,7 +3655,6 @@ dependencies = [ "vey-udpdump", "vey-xcrypt", "vey-yaml", - "yaml-rust2", "zeroize", ] @@ -3696,12 +3727,12 @@ dependencies = [ "redis", "rustls", "rustls-pki-types", + "saphyr", "tokio", "tokio-rustls", "vey-socket", "vey-types", "vey-yaml", - "yaml-rust2", ] [[package]] @@ -3721,6 +3752,7 @@ dependencies = [ "log", "rustls", "rustls-pki-types", + "saphyr", "thiserror", "tokio", "tokio-util", @@ -3728,7 +3760,6 @@ dependencies = [ "vey-socket", "vey-types", "vey-yaml", - "yaml-rust2", ] [[package]] @@ -3751,11 +3782,11 @@ version = "0.5.0" dependencies = [ "anyhow", "log", + "saphyr", "tokio", "vey-compat", "vey-openssl", "vey-yaml", - "yaml-rust2", ] [[package]] @@ -3844,6 +3875,7 @@ dependencies = [ "jiff", "log", "memchr", + "saphyr", "serde_json", "snap", "snmalloc-rs", @@ -3860,7 +3892,6 @@ dependencies = [ "vey-statsd-proto", "vey-types", "vey-yaml", - "yaml-rust2", "zmij", ] @@ -3871,11 +3902,11 @@ dependencies = [ "anyhow", "itoa", "log", + "saphyr", "smallvec", "vey-io-sys", "vey-types", "vey-yaml", - "yaml-rust2", "zmij", ] @@ -3926,6 +3957,7 @@ dependencies = [ "jiff", "kanal", "log", + "saphyr", "serde", "serde_json", "slog", @@ -3934,7 +3966,6 @@ dependencies = [ "vey-io-sys", "vey-types", "vey-yaml", - "yaml-rust2", "zmij", ] @@ -3961,6 +3992,7 @@ dependencies = [ "log", "redis", "rustc-hash", + "saphyr", "serde_json", "tokio", "tokio-util", @@ -3968,7 +4000,6 @@ dependencies = [ "vey-redis-client", "vey-types", "vey-yaml", - "yaml-rust2", ] [[package]] @@ -4029,6 +4060,7 @@ version = "0.3.0" dependencies = [ "anyhow", "log", + "saphyr", "tokio", "vey-dpi", "vey-io-ext", @@ -4036,7 +4068,6 @@ dependencies = [ "vey-socket", "vey-types", "vey-yaml", - "yaml-rust2", ] [[package]] @@ -4063,6 +4094,7 @@ dependencies = [ "rand", "regex", "rustls-pki-types", + "saphyr", "url", "variant-ssl", "vey-compat", @@ -4071,7 +4103,6 @@ dependencies = [ "vey-geoip-types", "vey-histogram", "vey-types", - "yaml-rust2", ] [[package]] @@ -4287,16 +4318,6 @@ version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "550a2b930b62486a393c52d5c3b84bff264b28aa437ed64694d31e93b1757af7" -[[package]] -name = "yaml-rust2" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57e5b818a27a4cd30884ea380857a5e56f7ec3ba24a3990a3cc0b95af3238e18" -dependencies = [ - "arraydeque", - "hashlink", -] - [[package]] name = "yoke" version = "0.8.4" diff --git a/Cargo.toml b/Cargo.toml index ac597f106..d16383641 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -205,7 +205,7 @@ socket2 = { version = "0.6.4", features = ["all"] } snmalloc = { package = "snmalloc-rs", version = "0.7.5" } # serde = "1.0" -yaml-rust = { package = "yaml-rust2", version = "0.13", default-features = false } +saphyr = { version = "0.3.3", default-features = false } serde_json = "1.0" rmp-serde = "1" rmp = "0.8" diff --git a/lib/vey-cert-agent/Cargo.toml b/lib/vey-cert-agent/Cargo.toml index 1d653130c..61f82e123 100644 --- a/lib/vey-cert-agent/Cargo.toml +++ b/lib/vey-cert-agent/Cargo.toml @@ -12,7 +12,7 @@ log.workspace = true tokio = { workspace = true, features = ["net", "rt", "sync"] } openssl.workspace = true rmpv.workspace = true -yaml-rust = { workspace = true, optional = true } +saphyr = { workspace = true, optional = true } vey-types = { workspace = true, features = ["openssl"] } vey-msgpack = { workspace = true, features = ["openssl"] } vey-socket.workspace = true @@ -25,4 +25,4 @@ tokio = { workspace = true, features = ["macros", "rt", "rt-multi-thread", "time [features] default = [] tongsuo = ["openssl/tongsuo"] -yaml = ["dep:vey-yaml", "dep:yaml-rust"] +yaml = ["dep:vey-yaml", "dep:saphyr"] diff --git a/lib/vey-cert-agent/src/config/yaml.rs b/lib/vey-cert-agent/src/config/yaml.rs index 6e944a3fb..b28b8a630 100644 --- a/lib/vey-cert-agent/src/config/yaml.rs +++ b/lib/vey-cert-agent/src/config/yaml.rs @@ -5,7 +5,7 @@ */ use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use super::CertAgentConfig; @@ -18,7 +18,7 @@ impl CertAgentConfig { pub fn parse_yaml(value: &Yaml) -> anyhow::Result { match value { - Yaml::Hash(map) => { + Yaml::Mapping(map) => { let mut config = CertAgentConfig::default(); vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { @@ -72,7 +72,7 @@ impl CertAgentConfig { Ok(config) } - Yaml::String(_) => { + Yaml::Value(Scalar::String(_)) => { let mut config = CertAgentConfig::default(); config .set_query_peer_addr_by_yaml(value) @@ -89,10 +89,12 @@ impl CertAgentConfig { #[cfg(test)] mod tests { use super::*; + use saphyr::LoadableYamlNode; + use std::time::Duration; + use vey_yaml::value::as_socket_buffer_config; use vey_yaml::yaml_doc; - use yaml_rust::YamlLoader; #[test] fn parse_yaml_ok() { @@ -181,7 +183,7 @@ mod tests { for (key, value) in test_cases { let yaml_str = format!("{key}: {value}"); - let yaml = &YamlLoader::load_from_str(&yaml_str).unwrap()[0]; + let yaml = &Yaml::load_from_str(&yaml_str).unwrap()[0]; assert!(CertAgentConfig::parse_yaml(yaml).is_err()); } @@ -194,8 +196,8 @@ mod tests { assert!(CertAgentConfig::parse_yaml(&yaml).is_err()); // Invalid YAML types - assert!(CertAgentConfig::parse_yaml(&yaml_rust::Yaml::Boolean(true)).is_err()); - assert!(CertAgentConfig::parse_yaml(&yaml_rust::Yaml::Array(vec![])).is_err()); - assert!(CertAgentConfig::parse_yaml(&yaml_rust::Yaml::Null).is_err()); + assert!(CertAgentConfig::parse_yaml(&Yaml::Value(Scalar::Boolean(true))).is_err()); + assert!(CertAgentConfig::parse_yaml(&Yaml::Sequence(vec![])).is_err()); + assert!(CertAgentConfig::parse_yaml(&Yaml::Value(Scalar::Null)).is_err()); } } diff --git a/lib/vey-daemon/Cargo.toml b/lib/vey-daemon/Cargo.toml index 85e6be1a4..1f014f3ba 100644 --- a/lib/vey-daemon/Cargo.toml +++ b/lib/vey-daemon/Cargo.toml @@ -17,7 +17,7 @@ lru.workspace = true clap.workspace = true slog = { workspace = true, features = ["max_level_trace", "release_max_level_info"] } async-trait.workspace = true -yaml-rust.workspace = true +saphyr.workspace = true foldhash.workspace = true itoa.workspace = true capnp.workspace = true diff --git a/lib/vey-daemon/src/control/config/local.rs b/lib/vey-daemon/src/control/config/local.rs index 044dcafd5..37337f151 100644 --- a/lib/vey-daemon/src/control/config/local.rs +++ b/lib/vey-daemon/src/control/config/local.rs @@ -7,7 +7,7 @@ use std::sync::OnceLock; use anyhow::anyhow; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use super::GeneralControllerConfig; @@ -27,14 +27,14 @@ impl LocalControllerConfig { pub(crate) fn load(v: &Yaml) -> anyhow::Result<()> { match v { - Yaml::Hash(map) => { + Yaml::Mapping(map) => { let mut config = LocalControllerConfig::default(); vey_yaml::foreach_kv(map, |k, v| config.set(k, v))?; LOCAL_CONTROLLER_CONFIG .set(config) .map_err(|_| anyhow!("local controller config has already been set")) } - Yaml::Null => Ok(()), + Yaml::Value(Scalar::Null) => Ok(()), _ => Err(anyhow!("root value type should be hash")), } } diff --git a/lib/vey-daemon/src/control/config/mod.rs b/lib/vey-daemon/src/control/config/mod.rs index 71a48243f..21ca68783 100644 --- a/lib/vey-daemon/src/control/config/mod.rs +++ b/lib/vey-daemon/src/control/config/mod.rs @@ -5,7 +5,7 @@ */ use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; mod local; @@ -55,14 +55,14 @@ pub(crate) use local::LocalControllerConfig; pub fn load(v: &Yaml) -> anyhow::Result<()> { match v { - Yaml::Hash(map) => { + Yaml::Mapping(map) => { vey_yaml::foreach_kv(map, |k, v| match k { "local" => LocalControllerConfig::load(v), _ => Err(anyhow!("invalid key '{k}'")), })?; Ok(()) } - Yaml::Null => Ok(()), + Yaml::Value(Scalar::Null) => Ok(()), _ => Err(anyhow!("root value type should be hash")), } } @@ -70,6 +70,7 @@ pub fn load(v: &Yaml) -> anyhow::Result<()> { #[cfg(test)] mod tests { use super::*; + use vey_yaml::yaml_str; #[test] diff --git a/lib/vey-daemon/src/control/text.rs b/lib/vey-daemon/src/control/text.rs index 7af9f0ed7..f87e852c3 100644 --- a/lib/vey-daemon/src/control/text.rs +++ b/lib/vey-daemon/src/control/text.rs @@ -9,7 +9,6 @@ use std::str::SplitWhitespace; use anyhow::anyhow; use tokio::io::{AsyncBufRead, AsyncWrite}; use tokio::time::Duration; -use yaml_rust::Yaml; use vey_io_ext::{LimitedBufReadExt, LimitedWriteExt}; @@ -140,7 +139,7 @@ where fn set(&mut self, mut iter: SplitWhitespace) -> anyhow::Result { if let Some(key) = iter.next() { if let Some(value) = iter.next() { - self.config.set(key, &Yaml::String(value.to_owned()))?; + self.config.set(key, &vey_yaml::yaml_str!(value))?; Ok(format!("{key} = {value}")) } else { Err(anyhow!("no value for {key} found")) diff --git a/lib/vey-daemon/src/log/event/config.rs b/lib/vey-daemon/src/log/event/config.rs index 9d3ebf813..f8cdf715c 100644 --- a/lib/vey-daemon/src/log/event/config.rs +++ b/lib/vey-daemon/src/log/event/config.rs @@ -9,8 +9,8 @@ use std::sync::Arc; use anyhow::{Context, anyhow}; use log::warn; +use saphyr::{Scalar, Yaml}; use slog::{Logger, OwnedKV, SendSyncRefUnwindSafeKV}; -use yaml_rust::Yaml; use vey_fluentd::FluentdClientConfig; #[cfg(target_os = "linux")] @@ -98,7 +98,7 @@ impl LogConfig { pub fn parse_yaml(v: &Yaml, conf_dir: &Path, program_name: &str) -> anyhow::Result { match v { - Yaml::String(s) => match s.as_str() { + Yaml::Value(Scalar::String(s)) => match s.as_ref() { "discard" => Ok(LogConfig::new_discard()), #[cfg(target_os = "linux")] "journal" => Ok(LogConfig::new_journal(program_name)), @@ -107,7 +107,7 @@ impl LogConfig { "stdout" => Ok(LogConfig::new_stdout(program_name)), _ => Err(anyhow!("invalid log config")), }, - Yaml::Hash(map) => { + Yaml::Mapping(map) => { let mut config = LogConfig::new_discard(); vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { #[cfg(target_os = "linux")] diff --git a/lib/vey-daemon/src/register/config.rs b/lib/vey-daemon/src/register/config.rs index ba99bbc3c..92be1ed19 100644 --- a/lib/vey-daemon/src/register/config.rs +++ b/lib/vey-daemon/src/register/config.rs @@ -8,7 +8,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use http::uri::PathAndQuery; -use yaml_rust::{Yaml, yaml}; +use saphyr::{Scalar, Yaml}; use vey_types::metrics::MetricTagMap; use vey_types::net::UpstreamAddr; @@ -62,8 +62,8 @@ impl RegisterConfig { pub(crate) fn parse(&mut self, v: &Yaml) -> anyhow::Result<()> { match v { - Yaml::Hash(map) => self.parse_map(map), - Yaml::String(_) => { + Yaml::Mapping(map) => self.parse_map(map), + Yaml::Value(Scalar::String(_)) => { self.upstream = vey_yaml::value::as_upstream_addr(v, 0) .context("invalid upstream address string value")?; Ok(()) @@ -72,7 +72,7 @@ impl RegisterConfig { } } - fn parse_map(&mut self, map: &yaml::Hash) -> anyhow::Result<()> { + fn parse_map(&mut self, map: &saphyr::Mapping) -> anyhow::Result<()> { vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { "upstream" => { self.upstream = vey_yaml::value::as_upstream_addr(v, 0) @@ -116,6 +116,7 @@ impl RegisterConfig { #[cfg(test)] mod tests { use super::*; + use vey_yaml::{yaml_doc, yaml_str}; #[test] @@ -149,13 +150,13 @@ mod tests { fn parse_invalid_yaml_type() { let mut config = RegisterConfig::default(); - let yaml = Yaml::Array(vec![]); + let yaml = Yaml::Sequence(vec![]); assert!(config.parse(&yaml).is_err()); - let yaml = Yaml::Integer(123); + let yaml = Yaml::Value(Scalar::Integer(123)); assert!(config.parse(&yaml).is_err()); - let yaml = Yaml::Boolean(true); + let yaml = Yaml::Value(Scalar::Boolean(true)); assert!(config.parse(&yaml).is_err()); } diff --git a/lib/vey-daemon/src/register/mod.rs b/lib/vey-daemon/src/register/mod.rs index d4d049438..f9bfe8f2c 100644 --- a/lib/vey-daemon/src/register/mod.rs +++ b/lib/vey-daemon/src/register/mod.rs @@ -6,7 +6,7 @@ use std::sync::{Arc, OnceLock}; use log::warn; -use yaml_rust::Yaml; +use saphyr::Yaml; mod config; pub use config::RegisterConfig; @@ -32,6 +32,7 @@ pub fn get_pre_config() -> Option> { #[cfg(test)] mod tests { use super::*; + use saphyr::Scalar; use vey_yaml::yaml_str; #[test] @@ -60,10 +61,10 @@ mod tests { #[test] fn load_pre_config_err() { - let yaml = Yaml::Array(vec![]); + let yaml = Yaml::Sequence(vec![]); assert!(load_pre_config(&yaml).is_err()); - let yaml = Yaml::Integer(123); + let yaml = Yaml::Value(Scalar::Integer(123)); assert!(load_pre_config(&yaml).is_err()); } } diff --git a/lib/vey-daemon/src/runtime/config.rs b/lib/vey-daemon/src/runtime/config.rs index da9abb2d5..b032e4e86 100644 --- a/lib/vey-daemon/src/runtime/config.rs +++ b/lib/vey-daemon/src/runtime/config.rs @@ -8,7 +8,7 @@ use std::sync::OnceLock; use std::time::Duration; use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_runtime::blended::BlendedRuntimeConfig; use vey_runtime::unaided::UnaidedRuntimeConfig; @@ -70,8 +70,8 @@ pub fn get_task_quit_timeout() -> Duration { pub fn load(v: &Yaml) -> anyhow::Result<()> { match v { - Yaml::Hash(map) => vey_yaml::foreach_kv(map, set_global_config), - Yaml::Null => Ok(()), + Yaml::Mapping(map) => vey_yaml::foreach_kv(map, set_global_config), + Yaml::Value(Scalar::Null) => Ok(()), _ => Err(anyhow!("root value type should be hash")), } } @@ -120,6 +120,7 @@ fn set_global_config(k: &str, v: &Yaml) -> anyhow::Result<()> { #[cfg(test)] mod tests { use super::*; + use vey_yaml::yaml_doc; #[test] @@ -139,7 +140,7 @@ mod tests { #[test] fn load_rejects_non_hash_root() { - let err = load(&yaml_rust::Yaml::Integer(1)).unwrap_err(); + let err = load(&Yaml::Value(Scalar::Integer(1))).unwrap_err(); assert!(err.to_string().contains("root value type should be hash")); } diff --git a/lib/vey-daemon/src/stat/config.rs b/lib/vey-daemon/src/stat/config.rs index ee3611a70..e46ae266f 100644 --- a/lib/vey-daemon/src/stat/config.rs +++ b/lib/vey-daemon/src/stat/config.rs @@ -9,7 +9,7 @@ use std::sync::OnceLock; use anyhow::anyhow; use log::warn; -use yaml_rust::Yaml; +use saphyr::Yaml; use vey_statsd_client::StatsdClientConfig; use vey_types::metrics::NodeName; @@ -37,6 +37,7 @@ pub fn load(v: &Yaml, prefix: &str) -> anyhow::Result<()> { #[cfg(test)] mod tests { use super::*; + use vey_yaml::yaml_doc; #[test] diff --git a/lib/vey-fluentd/Cargo.toml b/lib/vey-fluentd/Cargo.toml index d3b442176..1f4b77f2f 100644 --- a/lib/vey-fluentd/Cargo.toml +++ b/lib/vey-fluentd/Cargo.toml @@ -21,7 +21,7 @@ openssl.workspace = true constant_time_eq.workspace = true hex.workspace = true log.workspace = true -yaml-rust = { workspace = true, optional = true } +saphyr = { workspace = true, optional = true } vey-compat.workspace = true vey-io-ext.workspace = true vey-socket.workspace = true @@ -31,4 +31,4 @@ vey-yaml = { workspace = true, optional = true, features = ["openssl"] } [features] default = [] -yaml = ["dep:vey-yaml", "dep:yaml-rust"] +yaml = ["dep:vey-yaml", "dep:saphyr"] diff --git a/lib/vey-fluentd/src/config/yaml.rs b/lib/vey-fluentd/src/config/yaml.rs index 9c769e8c7..8da8197db 100644 --- a/lib/vey-fluentd/src/config/yaml.rs +++ b/lib/vey-fluentd/src/config/yaml.rs @@ -7,14 +7,14 @@ use std::path::Path; use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use super::FluentdClientConfig; impl FluentdClientConfig { pub fn parse_yaml(value: &Yaml, lookup_dir: Option<&Path>) -> anyhow::Result { match value { - Yaml::Hash(map) => { + Yaml::Mapping(map) => { let mut config = FluentdClientConfig::default(); vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { @@ -108,12 +108,12 @@ impl FluentdClientConfig { Ok(config) } - Yaml::String(_) => { + Yaml::Value(Scalar::String(_)) => { let addr = vey_yaml::value::as_env_sockaddr(value)?; let config = FluentdClientConfig::new(addr); Ok(config) } - Yaml::Null => { + Yaml::Value(Scalar::Null) => { let config = FluentdClientConfig::default(); Ok(config) } @@ -127,6 +127,7 @@ impl FluentdClientConfig { #[cfg(test)] mod tests { use super::*; + use vey_yaml::{yaml_doc, yaml_str}; #[test] @@ -251,7 +252,7 @@ mod tests { #[test] fn parse_null() { - let config = FluentdClientConfig::parse_yaml(&Yaml::Null, None).unwrap(); + let config = FluentdClientConfig::parse_yaml(&Yaml::Value(Scalar::Null), None).unwrap(); assert_eq!(config.server_addr.port(), 24224); assert!(config.shared_key.is_empty()); assert!(config.username.is_empty()); @@ -261,19 +262,19 @@ mod tests { #[test] fn parse_invalid_yaml_types() { // Array - let yaml = Yaml::Array(vec![]); + let yaml = Yaml::Sequence(vec![]); assert!(FluentdClientConfig::parse_yaml(&yaml, None).is_err()); // Integer - let yaml = Yaml::Integer(123); + let yaml = Yaml::Value(Scalar::Integer(123)); assert!(FluentdClientConfig::parse_yaml(&yaml, None).is_err()); // Boolean - let yaml = Yaml::Boolean(true); + let yaml = Yaml::Value(Scalar::Boolean(true)); assert!(FluentdClientConfig::parse_yaml(&yaml, None).is_err()); // Float - let yaml = Yaml::Real("1.23".to_string()); + let yaml = Yaml::Value(Scalar::FloatingPoint((1.23_f64).into())); assert!(FluentdClientConfig::parse_yaml(&yaml, None).is_err()); } } diff --git a/lib/vey-ftp-client/Cargo.toml b/lib/vey-ftp-client/Cargo.toml index ccc4b880f..2d0f27d0d 100644 --- a/lib/vey-ftp-client/Cargo.toml +++ b/lib/vey-ftp-client/Cargo.toml @@ -17,7 +17,7 @@ jiff.workspace = true mime.workspace = true log.workspace = true anyhow = { workspace = true, optional = true } -yaml-rust = { workspace = true, optional = true } +saphyr = { workspace = true, optional = true } vey-types.workspace = true vey-io-ext.workspace = true vey-datetime.workspace = true @@ -25,4 +25,4 @@ vey-yaml = { workspace = true, optional = true } [features] default = [] -yaml = ["dep:vey-yaml", "dep:yaml-rust", "dep:anyhow"] +yaml = ["dep:vey-yaml", "dep:saphyr", "dep:anyhow"] diff --git a/lib/vey-ftp-client/src/config/yaml.rs b/lib/vey-ftp-client/src/config/yaml.rs index fb8e41027..ef77717f1 100644 --- a/lib/vey-ftp-client/src/config/yaml.rs +++ b/lib/vey-ftp-client/src/config/yaml.rs @@ -4,13 +4,13 @@ */ use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::Yaml; use super::{FtpClientConfig, FtpControlConfig, FtpTransferConfig}; impl FtpControlConfig { pub fn parse_yaml(value: &Yaml) -> anyhow::Result { - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { let mut config = FtpControlConfig::default(); vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { "max_line_len" | "max_line_length" => { @@ -39,7 +39,7 @@ impl FtpControlConfig { impl FtpTransferConfig { pub fn parse_yaml(value: &Yaml) -> anyhow::Result { - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { let mut config = FtpTransferConfig::default(); vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { "list_max_line_len" | "list_max_line_length" => { @@ -74,7 +74,7 @@ impl FtpTransferConfig { impl FtpClientConfig { pub fn parse_yaml(value: &Yaml) -> anyhow::Result { - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { let mut config = FtpClientConfig::default(); vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { "control" => { @@ -116,6 +116,7 @@ impl FtpClientConfig { #[cfg(test)] mod tests { use super::*; + use saphyr::Scalar; use vey_yaml::{yaml_doc, yaml_str}; #[test] @@ -334,22 +335,22 @@ mod tests { #[test] fn parse_invalid_yaml_types() { - let yaml = Yaml::Array(vec![]); + let yaml = Yaml::Sequence(vec![]); assert!(FtpControlConfig::parse_yaml(&yaml).is_err()); assert!(FtpTransferConfig::parse_yaml(&yaml).is_err()); assert!(FtpClientConfig::parse_yaml(&yaml).is_err()); - let yaml = Yaml::Integer(123); + let yaml = Yaml::Value(Scalar::Integer(123)); assert!(FtpControlConfig::parse_yaml(&yaml).is_err()); assert!(FtpTransferConfig::parse_yaml(&yaml).is_err()); assert!(FtpClientConfig::parse_yaml(&yaml).is_err()); - let yaml = Yaml::Boolean(true); + let yaml = Yaml::Value(Scalar::Boolean(true)); assert!(FtpControlConfig::parse_yaml(&yaml).is_err()); assert!(FtpTransferConfig::parse_yaml(&yaml).is_err()); assert!(FtpClientConfig::parse_yaml(&yaml).is_err()); - let yaml = Yaml::Null; + let yaml = Yaml::Value(Scalar::Null); assert!(FtpControlConfig::parse_yaml(&yaml).is_err()); assert!(FtpTransferConfig::parse_yaml(&yaml).is_err()); assert!(FtpClientConfig::parse_yaml(&yaml).is_err()); diff --git a/lib/vey-icap-client/Cargo.toml b/lib/vey-icap-client/Cargo.toml index c51698fad..1587077bf 100644 --- a/lib/vey-icap-client/Cargo.toml +++ b/lib/vey-icap-client/Cargo.toml @@ -24,7 +24,7 @@ tokio-rustls.workspace = true rustls-pki-types.workspace = true http.workspace = true h2.workspace = true -yaml-rust = { workspace = true, optional = true } +saphyr = { workspace = true, optional = true } futures-util.workspace = true arc-swap.workspace = true log.workspace = true @@ -41,4 +41,4 @@ tokio = { workspace = true, features = ["rt-multi-thread"] } [features] default = [] -yaml = ["dep:vey-yaml", "dep:yaml-rust"] +yaml = ["dep:vey-yaml", "dep:saphyr"] diff --git a/lib/vey-icap-client/src/service/config/yaml.rs b/lib/vey-icap-client/src/service/config/yaml.rs index 01c270fee..d7d978e23 100644 --- a/lib/vey-icap-client/src/service/config/yaml.rs +++ b/lib/vey-icap-client/src/service/config/yaml.rs @@ -8,14 +8,14 @@ use std::path::Path; use std::str::FromStr; use anyhow::{Context, anyhow}; +use saphyr::{Scalar, Yaml}; use url::Url; -use yaml_rust::{Yaml, yaml}; use super::{IcapMethod, IcapServiceConfig}; impl IcapServiceConfig { fn parse_yaml( - map: &yaml::Hash, + map: &saphyr::Mapping, method: IcapMethod, lookup_dir: Option<&Path>, ) -> anyhow::Result { @@ -88,7 +88,7 @@ impl IcapServiceConfig { Ok(()) } "respond_shared_names" => { - if let Yaml::Array(seq) = v { + if let Yaml::Sequence(seq) = v { for (i, v) in seq.iter().enumerate() { let name = vey_yaml::value::as_http_header_name(v) .context(format!("invalid http header name value for key {k}#{i}"))?; @@ -117,8 +117,8 @@ impl IcapServiceConfig { lookup_dir: Option<&Path>, ) -> anyhow::Result { match value { - Yaml::Hash(map) => Self::parse_yaml(map, IcapMethod::Reqmod, lookup_dir), - Yaml::String(s) => { + Yaml::Mapping(map) => Self::parse_yaml(map, IcapMethod::Reqmod, lookup_dir), + Yaml::Value(Scalar::String(s)) => { let url = Url::from_str(s).map_err(|e| anyhow!("invalid url string: {e}"))?; IcapServiceConfig::new(IcapMethod::Reqmod, url) } @@ -133,8 +133,8 @@ impl IcapServiceConfig { lookup_dir: Option<&Path>, ) -> anyhow::Result { match value { - Yaml::Hash(map) => Self::parse_yaml(map, IcapMethod::Respmod, lookup_dir), - Yaml::String(s) => { + Yaml::Mapping(map) => Self::parse_yaml(map, IcapMethod::Respmod, lookup_dir), + Yaml::Value(Scalar::String(s)) => { let url = Url::from_str(s).map_err(|e| anyhow!("invalid url string: {e}"))?; IcapServiceConfig::new(IcapMethod::Respmod, url) } @@ -148,6 +148,7 @@ impl IcapServiceConfig { #[cfg(test)] mod tests { use super::*; + use vey_yaml::{yaml_doc, yaml_str}; #[test] @@ -324,16 +325,16 @@ mod tests { #[test] fn parse_yaml_err() { - let yaml = Yaml::Array(vec![]); + let yaml = Yaml::Sequence(vec![]); assert!(IcapServiceConfig::parse_reqmod_service_yaml(&yaml, None).is_err()); - let yaml = Yaml::Integer(123); + let yaml = Yaml::Value(Scalar::Integer(123)); assert!(IcapServiceConfig::parse_reqmod_service_yaml(&yaml, None).is_err()); - let yaml = Yaml::Boolean(true); + let yaml = Yaml::Value(Scalar::Boolean(true)); assert!(IcapServiceConfig::parse_respmod_service_yaml(&yaml, None).is_err()); - let yaml = Yaml::Real("1.23".to_string()); + let yaml = Yaml::Value(Scalar::FloatingPoint((1.23_f64).into())); assert!(IcapServiceConfig::parse_respmod_service_yaml(&yaml, None).is_err()); let yaml = yaml_doc!( diff --git a/lib/vey-ip-locate/Cargo.toml b/lib/vey-ip-locate/Cargo.toml index 6af2aa825..9c92aa757 100644 --- a/lib/vey-ip-locate/Cargo.toml +++ b/lib/vey-ip-locate/Cargo.toml @@ -14,7 +14,7 @@ tokio = { workspace = true, features = ["sync", "net", "rt"] } tokio-util = { workspace = true, features = ["time"] } rustc-hash.workspace = true rmpv.workspace = true -yaml-rust = { workspace = true, optional = true } +saphyr = { workspace = true, optional = true } vey-types.workspace = true vey-geoip-types.workspace = true vey-msgpack = { workspace = true, features = ["geoip"] } @@ -26,4 +26,4 @@ tokio = { workspace = true, features = ["macros", "rt", "time", "sync"] } [features] default = [] -yaml = ["dep:vey-yaml", "dep:yaml-rust"] +yaml = ["dep:vey-yaml", "dep:saphyr"] diff --git a/lib/vey-ip-locate/src/config/yaml.rs b/lib/vey-ip-locate/src/config/yaml.rs index bb6dbe876..aa4fc26f6 100644 --- a/lib/vey-ip-locate/src/config/yaml.rs +++ b/lib/vey-ip-locate/src/config/yaml.rs @@ -8,7 +8,7 @@ use std::path::PathBuf; use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use super::QueryPeer; use crate::IpLocateServiceConfig; @@ -16,7 +16,7 @@ use crate::IpLocateServiceConfig; impl QueryPeer { fn parse_udp_yaml(v: &Yaml) -> anyhow::Result { match v { - Yaml::Hash(map) => { + Yaml::Mapping(map) => { let mut addr = None; vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { @@ -35,7 +35,7 @@ impl QueryPeer { Err(anyhow!("no target address has been set")) } } - Yaml::String(_) => { + Yaml::Value(Scalar::String(_)) => { let addr = vey_yaml::value::as_env_sockaddr(v)?; Ok(QueryPeer::Udp(addr)) } @@ -46,7 +46,7 @@ impl QueryPeer { #[cfg(unix)] fn parse_unix_yaml(v: &Yaml) -> anyhow::Result { match v { - Yaml::Hash(map) => { + Yaml::Mapping(map) => { let mut path: Option = None; vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { @@ -65,7 +65,7 @@ impl QueryPeer { Err(anyhow!("no path has been set")) } } - Yaml::String(_) => { + Yaml::Value(Scalar::String(_)) => { let path = vey_yaml::value::as_absolute_path(v)?; Ok(QueryPeer::Unix(path)) } @@ -102,7 +102,7 @@ impl IpLocateServiceConfig { pub fn parse_yaml(value: &Yaml) -> anyhow::Result { match value { - Yaml::Hash(map) => { + Yaml::Mapping(map) => { let mut config = IpLocateServiceConfig::default(); vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { @@ -137,7 +137,7 @@ impl IpLocateServiceConfig { Ok(()) } "query_peer" => { - if let Yaml::Hash(map) = v { + if let Yaml::Mapping(map) = v { vey_yaml::foreach_kv(map, |k, v| { config.set_query_peer_by_yaml_kv(k, v) }) @@ -174,7 +174,7 @@ impl IpLocateServiceConfig { Ok(config) } - Yaml::String(_) => { + Yaml::Value(Scalar::String(_)) => { let mut config = IpLocateServiceConfig::default(); config .set_query_peer_addr_by_yaml(value) @@ -191,7 +191,9 @@ impl IpLocateServiceConfig { #[cfg(test)] mod tests { use super::*; + use std::net::SocketAddr; + use vey_yaml::{yaml_doc, yaml_str}; fn udp(addr: &str) -> QueryPeer { @@ -301,19 +303,19 @@ mod tests { #[test] fn parse_invalid_yaml_types() { - let yaml = Yaml::Array(vec![]); + let yaml = Yaml::Sequence(vec![]); assert!(IpLocateServiceConfig::parse_yaml(&yaml).is_err()); - let yaml = Yaml::Integer(123); + let yaml = Yaml::Value(Scalar::Integer(123)); assert!(IpLocateServiceConfig::parse_yaml(&yaml).is_err()); - let yaml = Yaml::Boolean(true); + let yaml = Yaml::Value(Scalar::Boolean(true)); assert!(IpLocateServiceConfig::parse_yaml(&yaml).is_err()); - let yaml = Yaml::Real("1.23".to_string()); + let yaml = Yaml::Value(Scalar::FloatingPoint((1.23_f64).into())); assert!(IpLocateServiceConfig::parse_yaml(&yaml).is_err()); - let yaml = Yaml::Null; + let yaml = Yaml::Value(Scalar::Null); assert!(IpLocateServiceConfig::parse_yaml(&yaml).is_err()); } diff --git a/lib/vey-redis-client/Cargo.toml b/lib/vey-redis-client/Cargo.toml index 0104aa15d..0b9937fe8 100644 --- a/lib/vey-redis-client/Cargo.toml +++ b/lib/vey-redis-client/Cargo.toml @@ -12,14 +12,14 @@ redis = { workspace = true, features = ["aio", "tokio-comp"] } tokio = { workspace = true, features = ["macros", "net", "rt", "time"] } tokio-rustls.workspace = true rustls-pki-types.workspace = true -yaml-rust = { workspace = true, optional = true } +saphyr = { workspace = true, optional = true } vey-types = { workspace = true, features = ["rustls"] } vey-socket.workspace = true vey-yaml = { workspace = true, optional = true, features = ["rustls"] } [features] default = [] -yaml = ["dep:vey-yaml", "dep:yaml-rust"] +yaml = ["dep:vey-yaml", "dep:saphyr"] [dev-dependencies] rustls = { workspace = true, features = ["ring"] } diff --git a/lib/vey-redis-client/src/yaml.rs b/lib/vey-redis-client/src/yaml.rs index 3fb6e7211..ceb9f94f1 100644 --- a/lib/vey-redis-client/src/yaml.rs +++ b/lib/vey-redis-client/src/yaml.rs @@ -7,7 +7,7 @@ use std::path::Path; use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::Yaml; use super::RedisClientConfigBuilder; @@ -74,10 +74,13 @@ impl RedisClientConfigBuilder { #[cfg(test)] mod tests { use super::*; + use rustls_pki_types::ServerName; + use std::net::IpAddr; use std::str::FromStr; use std::time::Duration; + use vey_types::net::{Host, RustlsClientConfigBuilder, UpstreamAddr}; use vey_yaml::yaml_doc; @@ -99,7 +102,7 @@ mod tests { response_timeout: "5s" "# ); - for (k, v) in yaml.as_hash().unwrap().iter() { + for (k, v) in yaml.as_mapping().unwrap().iter() { builder .set_by_yaml_kv(k.as_str().unwrap(), v, None) .unwrap(); @@ -129,7 +132,7 @@ mod tests { fn set_by_yaml_kv_address_alias() { let mut builder = RedisClientConfigBuilder::default(); let yaml = yaml_doc!(r#"address: "192.168.1.1:6399""#); - for (k, v) in yaml.as_hash().unwrap().iter() { + for (k, v) in yaml.as_mapping().unwrap().iter() { builder .set_by_yaml_kv(k.as_str().unwrap(), v, None) .unwrap(); @@ -144,7 +147,7 @@ mod tests { fn set_by_yaml_kv_read_timeout_alias() { let mut builder = RedisClientConfigBuilder::default(); let yaml = yaml_doc!(r#"read_timeout: "3s""#); - for (k, v) in yaml.as_hash().unwrap().iter() { + for (k, v) in yaml.as_mapping().unwrap().iter() { builder .set_by_yaml_kv(k.as_str().unwrap(), v, None) .unwrap(); @@ -168,7 +171,7 @@ mod tests { read_timeout: "5xs" "# ); - for (k, v) in yaml.as_hash().unwrap().iter() { + for (k, v) in yaml.as_mapping().unwrap().iter() { assert!( builder .set_by_yaml_kv(k.as_str().unwrap(), v, None) diff --git a/lib/vey-resolver/Cargo.toml b/lib/vey-resolver/Cargo.toml index 340925bd4..2fb6d424e 100644 --- a/lib/vey-resolver/Cargo.toml +++ b/lib/vey-resolver/Cargo.toml @@ -25,7 +25,7 @@ rustls = { workspace = true, optional = true } rustls-pki-types = { workspace = true, optional = true } kanal = { workspace = true, optional = true, features = ["async"] } async-recursion = { workspace = true, optional = true } -yaml-rust = { workspace = true, optional = true } +saphyr = { workspace = true, optional = true } vey-types.workspace = true vey-socket = { workspace = true, optional = true } vey-hickory-client = { workspace = true, optional = true } @@ -33,7 +33,7 @@ vey-yaml = { workspace = true, optional = true } [features] default = [] -yaml = ["dep:yaml-rust", "dep:vey-yaml"] +yaml = ["dep:saphyr", "dep:vey-yaml"] c-ares = ["dep:c-ares", "dep:c-ares-resolver", "dep:c-ares-sys"] vendored-c-ares = ["c-ares", "c-ares-resolver/vendored", "c-ares/vendored"] hickory = ["dep:hickory-net", "dep:hickory-proto", "dep:kanal", "dep:rustls", "dep:rustls-pki-types", "dep:async-recursion", "dep:vey-hickory-client", "vey-types/rustls", "dep:vey-socket", "vey-yaml?/rustls"] diff --git a/lib/vey-resolver/src/driver/c_ares/config/mod.rs b/lib/vey-resolver/src/driver/c_ares/config/mod.rs index 3b749b441..73c6746d7 100644 --- a/lib/vey-resolver/src/driver/c_ares/config/mod.rs +++ b/lib/vey-resolver/src/driver/c_ares/config/mod.rs @@ -11,7 +11,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use c_ares_resolver::FutureResolver; use indexmap::IndexSet; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use super::CAresResolver; use crate::BoxResolverDriver; @@ -82,7 +82,7 @@ impl CAresDriverConfig { fn parse_server_array(&mut self, addrs: &[Yaml]) -> anyhow::Result<()> { for (i, addr) in addrs.iter().enumerate() { - if let Yaml::String(addr) = addr { + if let Yaml::Value(Scalar::String(addr)) = addr { self.add_server(addr) .context(format!("#{i} is not a valid server"))?; } else { diff --git a/lib/vey-resolver/src/driver/c_ares/config/yaml.rs b/lib/vey-resolver/src/driver/c_ares/config/yaml.rs index 5cead7798..52e4330dd 100644 --- a/lib/vey-resolver/src/driver/c_ares/config/yaml.rs +++ b/lib/vey-resolver/src/driver/c_ares/config/yaml.rs @@ -5,7 +5,7 @@ */ use anyhow::anyhow; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use super::CAresDriverConfig; @@ -13,8 +13,8 @@ impl CAresDriverConfig { pub fn set_by_yaml_kv(&mut self, k: &str, v: &Yaml) -> anyhow::Result<()> { match vey_yaml::key::normalize(k).as_str() { "server" => match v { - Yaml::String(addrs) => self.parse_server_str(addrs), - Yaml::Array(seq) => self.parse_server_array(seq), + Yaml::Value(Scalar::String(addrs)) => self.parse_server_str(addrs), + Yaml::Sequence(seq) => self.parse_server_array(seq), _ => Err(anyhow!("invalid yaml value type, expect string / array")), }, "each_timeout" => { @@ -77,9 +77,11 @@ impl CAresDriverConfig { #[cfg(test)] mod tests { use super::*; + use std::net::{Ipv4Addr, Ipv6Addr}; use std::str::FromStr; use std::time::Duration; + use vey_yaml::yaml_doc; #[test] @@ -102,7 +104,7 @@ mod tests { positive_max_ttl: 3600 "# ); - for (k, v) in yaml.as_hash().unwrap().iter() { + for (k, v) in yaml.as_mapping().unwrap().iter() { config.set_by_yaml_kv(k.as_str().unwrap(), v).unwrap(); } @@ -139,7 +141,7 @@ mod tests { round_robin: false "# ); - for (k, v) in yaml.as_hash().unwrap().iter() { + for (k, v) in yaml.as_mapping().unwrap().iter() { config.set_by_yaml_kv(k.as_str().unwrap(), v).unwrap(); } @@ -160,7 +162,7 @@ mod tests { protective_cache_ttl: 180 "# ); - for (k, v) in yaml.as_hash().unwrap().iter() { + for (k, v) in yaml.as_mapping().unwrap().iter() { config.set_by_yaml_kv(k.as_str().unwrap(), v).unwrap(); } @@ -189,7 +191,7 @@ mod tests { invalid_key: "value" "# ); - for (k, v) in yaml.as_hash().unwrap().iter() { + for (k, v) in yaml.as_mapping().unwrap().iter() { assert!(config.set_by_yaml_kv(k.as_str().unwrap(), v).is_err()); } @@ -199,7 +201,7 @@ mod tests { server: [456, "valid.server.com"] "# ); - for (k, v) in yaml.as_hash().unwrap().iter() { + for (k, v) in yaml.as_mapping().unwrap().iter() { assert!(config.set_by_yaml_kv(k.as_str().unwrap(), v).is_err()); } @@ -209,7 +211,7 @@ mod tests { server: "0.0.0.0 invalid-server 255.255.255.255" "# ); - for (k, v) in yaml.as_hash().unwrap().iter() { + for (k, v) in yaml.as_mapping().unwrap().iter() { assert!(config.set_by_yaml_kv(k.as_str().unwrap(), v).is_err()); } } @@ -223,7 +225,7 @@ mod tests { positive_max_ttl: 300 "# ); - for (k, v) in yaml.as_hash().unwrap().iter() { + for (k, v) in yaml.as_mapping().unwrap().iter() { config.set_by_yaml_kv(k.as_str().unwrap(), v).unwrap(); } assert!(config.check().is_ok()); diff --git a/lib/vey-resolver/src/driver/hickory/config/mod.rs b/lib/vey-resolver/src/driver/hickory/config/mod.rs index 6693338e5..de076eb1d 100644 --- a/lib/vey-resolver/src/driver/hickory/config/mod.rs +++ b/lib/vey-resolver/src/driver/hickory/config/mod.rs @@ -13,7 +13,7 @@ use std::time::Duration; use anyhow::Context; use anyhow::anyhow; #[cfg(feature = "yaml")] -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_socket::BindAddr; use vey_types::net::{DnsEncryptionConfigBuilder, TcpMiscSockOpts, UdpMiscSockOpts}; @@ -88,7 +88,7 @@ impl HickoryDriverConfig { #[cfg(feature = "yaml")] fn parse_server_array(&mut self, addrs: &[Yaml]) -> anyhow::Result<()> { for (i, addr) in addrs.iter().enumerate() { - if let Yaml::String(addr) = addr { + if let Yaml::Value(Scalar::String(addr)) = addr { self.add_server_str(addr) .context(format!("#{i} is not a valid ip address"))?; } else { diff --git a/lib/vey-resolver/src/driver/hickory/config/yaml.rs b/lib/vey-resolver/src/driver/hickory/config/yaml.rs index 4245a3477..97fd17b31 100644 --- a/lib/vey-resolver/src/driver/hickory/config/yaml.rs +++ b/lib/vey-resolver/src/driver/hickory/config/yaml.rs @@ -6,7 +6,7 @@ use std::path::Path; use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_socket::BindAddr; @@ -21,8 +21,8 @@ impl HickoryDriverConfig { ) -> anyhow::Result<()> { match vey_yaml::key::normalize(k).as_str() { "server" => match v { - Yaml::String(addrs) => self.parse_server_str(addrs), - Yaml::Array(seq) => self.parse_server_array(seq), + Yaml::Value(Scalar::String(addrs)) => self.parse_server_str(addrs), + Yaml::Sequence(seq) => self.parse_server_array(seq), _ => Err(anyhow!("invalid yaml value type, expect string / array")), }, "server_port" => { @@ -104,9 +104,11 @@ impl HickoryDriverConfig { #[cfg(test)] mod tests { use super::*; + use std::net::IpAddr; use std::str::FromStr; use std::time::Duration; + use vey_types::net::DnsEncryptionProtocol; use vey_yaml::yaml_doc; @@ -136,7 +138,7 @@ mod tests { negative_max_ttl: 1200 "# ); - for (k, v) in yaml.as_hash().unwrap().iter() { + for (k, v) in yaml.as_mapping().unwrap().iter() { config.set_by_yaml_kv(k.as_str().unwrap(), v, None).unwrap(); } @@ -171,7 +173,7 @@ mod tests { server_port: 5353 "# ); - for (k, v) in yaml.as_hash().unwrap().iter() { + for (k, v) in yaml.as_mapping().unwrap().iter() { config.set_by_yaml_kv(k.as_str().unwrap(), v, None).unwrap(); } @@ -204,7 +206,7 @@ mod tests { invalid_key: value "# ); - for (k, v) in yaml.as_hash().unwrap().iter() { + for (k, v) in yaml.as_mapping().unwrap().iter() { assert!(config.set_by_yaml_kv(k.as_str().unwrap(), v, None).is_err()); } @@ -214,7 +216,7 @@ mod tests { server: [456, "valid.server.com"] "# ); - for (k, v) in yaml.as_hash().unwrap().iter() { + for (k, v) in yaml.as_mapping().unwrap().iter() { assert!(config.set_by_yaml_kv(k.as_str().unwrap(), v, None).is_err()); } @@ -224,7 +226,7 @@ mod tests { server: "0.0.0.0 invalid-server 255.255.255.255" "# ); - for (k, v) in yaml.as_hash().unwrap().iter() { + for (k, v) in yaml.as_mapping().unwrap().iter() { assert!(config.set_by_yaml_kv(k.as_str().unwrap(), v, None).is_err()); } } @@ -247,7 +249,7 @@ mod tests { #[cfg(not(any(target_os = "linux", target_os = "android")))] let interface_name = "lo0"; - let yaml = Yaml::String(interface_name.to_string()); + let yaml = yaml_str!(interface_name); config .set_by_yaml_kv("bind_interface", &yaml, None) @@ -256,7 +258,7 @@ mod tests { assert_eq!(config.bind_addr, BindAddr::Interface(interface)); // invalid - let yaml = Yaml::Integer(123); + let yaml = Yaml::Value(Scalar::Integer(123)); assert!( config .set_by_yaml_kv("bind_interface", &yaml, None) @@ -283,7 +285,7 @@ mod tests { positive_max_ttl: 300 "# }; - for (k, v) in yaml.as_hash().unwrap().iter() { + for (k, v) in yaml.as_mapping().unwrap().iter() { config.set_by_yaml_kv(k.as_str().unwrap(), v, None).unwrap(); } assert!(config.check().is_ok()); diff --git a/lib/vey-runtime/Cargo.toml b/lib/vey-runtime/Cargo.toml index 12664ef09..d477fd76b 100644 --- a/lib/vey-runtime/Cargo.toml +++ b/lib/vey-runtime/Cargo.toml @@ -12,7 +12,7 @@ description = "Worker runtimes for VEY services" anyhow.workspace = true log.workspace = true tokio = { workspace = true, features = ["rt-multi-thread", "rt", "sync", "net"] } -yaml-rust = { workspace = true, optional = true } +saphyr = { workspace = true, optional = true } vey-compat.workspace = true vey-openssl = { workspace = true, optional = true } vey-yaml = { workspace = true, optional = true, features = ["sched"] } @@ -20,4 +20,4 @@ vey-yaml = { workspace = true, optional = true, features = ["sched"] } [features] default = [] openssl-async-job = ["vey-openssl/async-job"] -yaml = ["dep:vey-yaml", "dep:yaml-rust"] +yaml = ["dep:vey-yaml", "dep:saphyr"] diff --git a/lib/vey-runtime/src/blended/yaml.rs b/lib/vey-runtime/src/blended/yaml.rs index d8f0bbb3c..e36fd9f6c 100644 --- a/lib/vey-runtime/src/blended/yaml.rs +++ b/lib/vey-runtime/src/blended/yaml.rs @@ -4,7 +4,7 @@ */ use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::Yaml; use super::BlendedRuntimeConfig; @@ -41,28 +41,30 @@ impl BlendedRuntimeConfig { #[cfg(test)] mod tests { use super::*; + use saphyr::Scalar; + use vey_yaml::yaml_str; #[test] fn parse_by_yaml_kv_ok() { let mut config = BlendedRuntimeConfig::new(); - let yaml = Yaml::Integer(4); + let yaml = Yaml::Value(Scalar::Integer(4)); assert!(config.parse_by_yaml_kv("thread_number", &yaml).is_ok()); assert_eq!(config.thread_number, Some(4)); - let yaml = Yaml::String("worker_thread".to_string()); + let yaml = yaml_str!("worker_thread"); assert!(config.parse_by_yaml_kv("thread_name", &yaml).is_ok()); assert_eq!(config.thread_name, Some("worker_thread".to_string())); - let yaml = Yaml::Integer(2048); + let yaml = Yaml::Value(Scalar::Integer(2048)); assert!(config.parse_by_yaml_kv("thread_stack_size", &yaml).is_ok()); assert_eq!(config.thread_stack_size, Some(2048)); - let yaml = Yaml::String("2K".to_string()); + let yaml = yaml_str!("2K"); assert!(config.parse_by_yaml_kv("thread_stack_size", &yaml).is_ok()); assert_eq!(config.thread_stack_size, Some(2000)); - let yaml = Yaml::Integer(512); + let yaml = Yaml::Value(Scalar::Integer(512)); assert!( config .parse_by_yaml_kv("max_io_events_per_tick", &yaml) @@ -75,19 +77,19 @@ mod tests { fn parse_by_yaml_kv_err() { let mut config = BlendedRuntimeConfig::new(); - let yaml = Yaml::Integer(4); + let yaml = Yaml::Value(Scalar::Integer(4)); assert!(config.parse_by_yaml_kv("invalid_key", &yaml).is_err()); - let yaml = Yaml::String("four".to_string()); + let yaml = yaml_str!("four"); assert!(config.parse_by_yaml_kv("thread_number", &yaml).is_err()); - let yaml = Yaml::Boolean(true); + let yaml = Yaml::Value(Scalar::Boolean(true)); assert!(config.parse_by_yaml_kv("thread_name", &yaml).is_err()); - let yaml = Yaml::String("invalid_size".to_string()); + let yaml = yaml_str!("invalid_size"); assert!(config.parse_by_yaml_kv("thread_stack_size", &yaml).is_err()); - let yaml = Yaml::String("five".to_string()); + let yaml = yaml_str!("five"); assert!( config .parse_by_yaml_kv("max_io_events_per_tick", &yaml) diff --git a/lib/vey-runtime/src/unaided/yaml.rs b/lib/vey-runtime/src/unaided/yaml.rs index 3b2dccbbd..a7a1bbbae 100644 --- a/lib/vey-runtime/src/unaided/yaml.rs +++ b/lib/vey-runtime/src/unaided/yaml.rs @@ -5,13 +5,13 @@ */ use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::Yaml; use super::UnaidedRuntimeConfig; impl UnaidedRuntimeConfig { pub fn parse_yaml(v: &Yaml) -> anyhow::Result { - if let Yaml::Hash(map) = v { + if let Yaml::Mapping(map) = v { let mut config = UnaidedRuntimeConfig::default(); #[cfg(any( target_os = "linux", @@ -49,7 +49,7 @@ impl UnaidedRuntimeConfig { windows, ))] "sched_affinity" => { - if let Yaml::Hash(map) = v { + if let Yaml::Mapping(map) = v { for (ik, iv) in map.iter() { let id = vey_yaml::value::as_usize(ik) .context(format!("the keys for {k} should be usize value"))?; @@ -114,8 +114,9 @@ impl UnaidedRuntimeConfig { #[cfg(test)] mod tests { use super::*; + use saphyr::LoadableYamlNode; + use vey_yaml::yaml_doc; - use yaml_rust::YamlLoader; #[test] fn parse_yaml_ok() { @@ -212,7 +213,7 @@ mod tests { #[test] fn parse_yaml_err() { // Invalid root type - let yaml = YamlLoader::load_from_str("invalid").unwrap(); + let yaml = Yaml::load_from_str("invalid").unwrap(); assert!(UnaidedRuntimeConfig::parse_yaml(&yaml[0]).is_err()); // Unknown key diff --git a/lib/vey-statsd-client/Cargo.toml b/lib/vey-statsd-client/Cargo.toml index 471713a2e..08a35ead6 100644 --- a/lib/vey-statsd-client/Cargo.toml +++ b/lib/vey-statsd-client/Cargo.toml @@ -14,11 +14,11 @@ zmij.workspace = true smallvec.workspace = true log.workspace = true anyhow = { workspace = true, optional = true } -yaml-rust = { workspace = true, optional = true } +saphyr = { workspace = true, optional = true } vey-io-sys.workspace = true vey-types.workspace = true vey-yaml = { workspace = true, optional = true } [features] default = [] -yaml = ["dep:vey-yaml", "dep:yaml-rust", "dep:anyhow"] +yaml = ["dep:vey-yaml", "dep:saphyr", "dep:anyhow"] diff --git a/lib/vey-statsd-client/src/config/yaml.rs b/lib/vey-statsd-client/src/config/yaml.rs index 734a67257..f692ac28a 100644 --- a/lib/vey-statsd-client/src/config/yaml.rs +++ b/lib/vey-statsd-client/src/config/yaml.rs @@ -10,7 +10,7 @@ use std::str::FromStr; use anyhow::{Context, anyhow}; use log::warn; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_types::metrics::NodeName; @@ -19,7 +19,7 @@ use super::{StatsdBackend, StatsdClientConfig}; impl StatsdBackend { pub fn parse_udp_yaml(v: &Yaml) -> anyhow::Result { match v { - Yaml::Hash(map) => { + Yaml::Mapping(map) => { let mut addr: Option = None; let mut bind: Option = None; @@ -46,7 +46,7 @@ impl StatsdBackend { Err(anyhow!("no target address has been set")) } } - Yaml::String(s) => { + Yaml::Value(Scalar::String(s)) => { let addr = SocketAddr::from_str(s).map_err(|e| anyhow!("invalid SocketAddr: {e}"))?; Ok(StatsdBackend::Udp(addr, None)) @@ -58,7 +58,7 @@ impl StatsdBackend { #[cfg(unix)] pub fn parse_unix_yaml(v: &Yaml) -> anyhow::Result { match v { - Yaml::Hash(map) => { + Yaml::Mapping(map) => { let mut path: Option = None; vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { @@ -77,7 +77,7 @@ impl StatsdBackend { Err(anyhow!("no path has been set")) } } - Yaml::String(_) => { + Yaml::Value(Scalar::String(_)) => { let path = vey_yaml::value::as_absolute_path(v)?; Ok(StatsdBackend::Unix(path)) } @@ -88,7 +88,7 @@ impl StatsdBackend { impl StatsdClientConfig { pub fn parse_yaml(v: &Yaml, prefix: NodeName) -> anyhow::Result { - if let Yaml::Hash(map) = v { + if let Yaml::Mapping(map) = v { let mut config = StatsdClientConfig::with_prefix(prefix); vey_yaml::foreach_kv(map, |k, v| config.set_by_yaml_kv(k, v))?; Ok(config) @@ -113,7 +113,7 @@ impl StatsdClientConfig { self.set_backend(target); } "target" | "backend" => { - return if let Yaml::Hash(map) = v { + return if let Yaml::Mapping(map) = v { vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { "udp" => { let target = StatsdBackend::parse_udp_yaml(v) @@ -166,8 +166,10 @@ impl StatsdClientConfig { #[cfg(test)] mod tests { use super::*; + use std::net::Ipv4Addr; use std::time::Duration; + use vey_yaml::yaml_doc; fn default_node_name() -> NodeName { @@ -205,10 +207,10 @@ mod tests { ); assert!(StatsdBackend::parse_udp_yaml(&yaml).is_err()); - let yaml = Yaml::Array(vec![]); + let yaml = Yaml::Sequence(vec![]); assert!(StatsdBackend::parse_udp_yaml(&yaml).is_err()); - let yaml = Yaml::Integer(123); + let yaml = Yaml::Value(Scalar::Integer(123)); assert!(StatsdBackend::parse_udp_yaml(&yaml).is_err()); } @@ -236,10 +238,10 @@ mod tests { ); assert!(StatsdBackend::parse_unix_yaml(&yaml).is_err()); - let yaml = Yaml::Boolean(true); + let yaml = Yaml::Value(Scalar::Boolean(true)); assert!(StatsdBackend::parse_unix_yaml(&yaml).is_err()); - let yaml = Yaml::Null; + let yaml = Yaml::Value(Scalar::Null); assert!(StatsdBackend::parse_unix_yaml(&yaml).is_err()); } @@ -450,19 +452,19 @@ mod tests { ); assert!(StatsdClientConfig::parse_yaml(&yaml, default_node_name()).is_err()); - let yaml = Yaml::Array(vec![]); + let yaml = Yaml::Sequence(vec![]); assert!(StatsdClientConfig::parse_yaml(&yaml, default_node_name()).is_err()); - let yaml = Yaml::Integer(123); + let yaml = Yaml::Value(Scalar::Integer(123)); assert!(StatsdClientConfig::parse_yaml(&yaml, default_node_name()).is_err()); - let yaml = Yaml::Boolean(true); + let yaml = Yaml::Value(Scalar::Boolean(true)); assert!(StatsdClientConfig::parse_yaml(&yaml, default_node_name()).is_err()); - let yaml = Yaml::Real("1.23".to_string()); + let yaml = Yaml::Value(Scalar::FloatingPoint((1.23_f64).into())); assert!(StatsdClientConfig::parse_yaml(&yaml, default_node_name()).is_err()); - let yaml = Yaml::Null; + let yaml = Yaml::Value(Scalar::Null); assert!(StatsdClientConfig::parse_yaml(&yaml, default_node_name()).is_err()); } } diff --git a/lib/vey-syslog/Cargo.toml b/lib/vey-syslog/Cargo.toml index a6c534aea..085358a4b 100644 --- a/lib/vey-syslog/Cargo.toml +++ b/lib/vey-syslog/Cargo.toml @@ -19,7 +19,7 @@ serde_json.workspace = true log.workspace = true bytes.workspace = true anyhow = { workspace = true, optional = true } -yaml-rust = { workspace = true, optional = true } +saphyr = { workspace = true, optional = true } vey-compat.workspace = true vey-datetime.workspace = true vey-io-sys.workspace = true @@ -28,4 +28,4 @@ vey-yaml = { workspace = true, optional = true } [features] default = [] -yaml = ["dep:vey-yaml", "dep:yaml-rust", "dep:anyhow"] +yaml = ["dep:vey-yaml", "dep:saphyr", "dep:anyhow"] diff --git a/lib/vey-syslog/src/backend/yaml.rs b/lib/vey-syslog/src/backend/yaml.rs index c8dadbd18..c929c734b 100644 --- a/lib/vey-syslog/src/backend/yaml.rs +++ b/lib/vey-syslog/src/backend/yaml.rs @@ -9,14 +9,14 @@ use std::path::PathBuf; use std::str::FromStr; use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use super::SyslogBackendBuilder; impl SyslogBackendBuilder { pub(crate) fn parse_udp_yaml(value: &Yaml) -> anyhow::Result { match value { - Yaml::Hash(map) => { + Yaml::Mapping(map) => { let mut addr: Option = None; let mut bind: Option = None; @@ -43,7 +43,7 @@ impl SyslogBackendBuilder { Err(anyhow!("no target address has been set")) } } - Yaml::String(s) => { + Yaml::Value(Scalar::String(s)) => { let addr = SocketAddr::from_str(s).map_err(|e| anyhow!("invalid SocketAddr: {e}"))?; Ok(SyslogBackendBuilder::Udp(None, addr)) @@ -55,7 +55,7 @@ impl SyslogBackendBuilder { #[cfg(unix)] pub(crate) fn parse_unix_yaml(value: &Yaml) -> anyhow::Result { match value { - Yaml::Hash(map) => { + Yaml::Mapping(map) => { let mut path: Option = None; vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { @@ -74,7 +74,7 @@ impl SyslogBackendBuilder { Err(anyhow!("no path has been set")) } } - Yaml::String(_) => { + Yaml::Value(Scalar::String(_)) => { let path = vey_yaml::value::as_absolute_path(value)?; Ok(SyslogBackendBuilder::Unix(Some(path))) } diff --git a/lib/vey-syslog/src/format/yaml.rs b/lib/vey-syslog/src/format/yaml.rs index 88fa94332..ae3d1fe87 100644 --- a/lib/vey-syslog/src/format/yaml.rs +++ b/lib/vey-syslog/src/format/yaml.rs @@ -5,7 +5,7 @@ */ use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use super::SyslogFormatterKind; @@ -15,7 +15,7 @@ impl SyslogFormatterKind { let mut message_id: Option = None; match value { - Yaml::Hash(map) => { + Yaml::Mapping(map) => { vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { "enterprise_id" => { enterprise_id = vey_yaml::value::as_i32(v) @@ -33,13 +33,13 @@ impl SyslogFormatterKind { })?; Ok(SyslogFormatterKind::Rfc5424(enterprise_id, message_id)) } - Yaml::Integer(i) => { + Yaml::Value(Scalar::Integer(i)) => { enterprise_id = i32::try_from(*i).map_err(|e| anyhow!("invalid enterprise_id: {e}"))?; Ok(SyslogFormatterKind::Rfc5424(enterprise_id, message_id)) } - Yaml::String(s) => { - message_id = Some(s.clone()); + Yaml::Value(Scalar::String(s)) => { + message_id = Some(s.to_string()); Ok(SyslogFormatterKind::Rfc5424(enterprise_id, message_id)) } _ => Err(anyhow!("invalid yaml value for rfc5424 syslog format")), diff --git a/lib/vey-syslog/src/yaml.rs b/lib/vey-syslog/src/yaml.rs index f9a4c64b1..f5ae673fc 100644 --- a/lib/vey-syslog/src/yaml.rs +++ b/lib/vey-syslog/src/yaml.rs @@ -5,14 +5,14 @@ */ use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use super::{Facility, SyslogBackendBuilder, SyslogBuilder, SyslogFormatterKind}; impl SyslogBuilder { pub fn parse_yaml(value: &Yaml, ident: &str) -> anyhow::Result { match value { - Yaml::Hash(map) => { + Yaml::Mapping(map) => { let mut builder = SyslogBuilder::with_ident(ident); let mut use_cee_log_syntax = false; let mut cee_event_flag: Option = None; @@ -32,7 +32,7 @@ impl SyslogBuilder { Ok(()) } "target" | "backend" => { - if let Yaml::Hash(map) = v { + if let Yaml::Mapping(map) = v { vey_yaml::foreach_kv(map, |k, v| { match vey_yaml::key::normalize(k).as_str() { "udp" => { @@ -92,7 +92,7 @@ impl SyslogBuilder { } Ok(builder) } - Yaml::Null => { + Yaml::Value(Scalar::Null) => { let mut builder = SyslogBuilder::with_ident(ident); builder.set_facility(Facility::Daemon); Ok(builder) @@ -107,22 +107,29 @@ impl SyslogBuilder { #[cfg(test)] mod tests { use super::*; + use vey_yaml::yaml_doc; #[test] fn parse_yaml_null() { - let builder = SyslogBuilder::parse_yaml(&Yaml::Null, "test").unwrap(); + let builder = SyslogBuilder::parse_yaml(&Yaml::Value(Scalar::Null), "test").unwrap(); assert_eq!(builder.ident, "test"); assert!(matches!(builder.facility, Facility::Daemon)); } #[test] fn parse_yaml_invalid_types() { - assert!(SyslogBuilder::parse_yaml(&Yaml::Array(vec![]), "test").is_err()); + assert!(SyslogBuilder::parse_yaml(&Yaml::Sequence(vec![]), "test").is_err()); - assert!(SyslogBuilder::parse_yaml(&Yaml::Integer(123), "test").is_err()); + assert!(SyslogBuilder::parse_yaml(&Yaml::Value(Scalar::Integer(123)), "test").is_err()); - assert!(SyslogBuilder::parse_yaml(&Yaml::Real("1.23".to_string()), "test").is_err()); + assert!( + SyslogBuilder::parse_yaml( + &Yaml::Value(Scalar::FloatingPoint((1.23_f64).into())), + "test" + ) + .is_err() + ); } #[allow(irrefutable_let_patterns)] diff --git a/lib/vey-tls-ticket/Cargo.toml b/lib/vey-tls-ticket/Cargo.toml index da66559c1..653547ed6 100644 --- a/lib/vey-tls-ticket/Cargo.toml +++ b/lib/vey-tls-ticket/Cargo.toml @@ -14,7 +14,7 @@ jiff.workspace = true tokio = { workspace = true, features = ["rt", "time", "macros"] } tokio-util = { workspace = true, features = ["time"] } serde_json.workspace = true -yaml-rust = { workspace = true, optional = true } +saphyr = { workspace = true, optional = true } redis = { workspace = true, features = ["aio", "tokio-comp"] } vey-types = { workspace = true, features = ["openssl"] } vey-json.workspace = true @@ -23,4 +23,4 @@ vey-yaml = { workspace = true, optional = true } [features] default = [] -yaml = ["vey-redis-client/yaml", "dep:vey-yaml", "dep:yaml-rust"] +yaml = ["vey-redis-client/yaml", "dep:vey-yaml", "dep:saphyr"] diff --git a/lib/vey-tls-ticket/src/config/yaml.rs b/lib/vey-tls-ticket/src/config/yaml.rs index 1dcc562df..96f1264cb 100644 --- a/lib/vey-tls-ticket/src/config/yaml.rs +++ b/lib/vey-tls-ticket/src/config/yaml.rs @@ -7,14 +7,14 @@ use std::path::Path; use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::Yaml; use super::TlsTicketConfig; use crate::source::TicketSourceConfig; impl TlsTicketConfig { pub fn parse_yaml(value: &Yaml, lookup_dir: Option<&Path>) -> anyhow::Result { - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { let mut config = TlsTicketConfig::default(); vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { "check_interval" => { @@ -51,6 +51,7 @@ impl TlsTicketConfig { #[cfg(test)] mod tests { use super::*; + use saphyr::Scalar; use vey_yaml::yaml_doc; #[test] @@ -130,19 +131,19 @@ mod tests { #[test] fn parse_invalid_yaml_types() { - let yaml = Yaml::Array(vec![]); + let yaml = Yaml::Sequence(vec![]); assert!(TlsTicketConfig::parse_yaml(&yaml, None).is_err()); - let yaml = Yaml::Integer(123); + let yaml = Yaml::Value(Scalar::Integer(123)); assert!(TlsTicketConfig::parse_yaml(&yaml, None).is_err()); - let yaml = Yaml::Boolean(true); + let yaml = Yaml::Value(Scalar::Boolean(true)); assert!(TlsTicketConfig::parse_yaml(&yaml, None).is_err()); - let yaml = Yaml::Real("1.23".to_string()); + let yaml = Yaml::Value(Scalar::FloatingPoint((1.23_f64).into())); assert!(TlsTicketConfig::parse_yaml(&yaml, None).is_err()); - let yaml = Yaml::Null; + let yaml = Yaml::Value(Scalar::Null); assert!(TlsTicketConfig::parse_yaml(&yaml, None).is_err()); } } diff --git a/lib/vey-tls-ticket/src/source/redis/yaml.rs b/lib/vey-tls-ticket/src/source/redis/yaml.rs index d3b3b48be..c6c542cb9 100644 --- a/lib/vey-tls-ticket/src/source/redis/yaml.rs +++ b/lib/vey-tls-ticket/src/source/redis/yaml.rs @@ -5,14 +5,12 @@ use std::path::Path; -use yaml_rust::yaml; - use super::RedisSourceConfig; use crate::source::CONFIG_KEY_SOURCE_TYPE; impl RedisSourceConfig { pub(crate) fn parse_yaml_map( - map: &yaml::Hash, + map: &saphyr::Mapping, lookup_dir: Option<&Path>, ) -> anyhow::Result { let mut config = RedisSourceConfig::default(); @@ -38,6 +36,7 @@ impl RedisSourceConfig { #[cfg(test)] mod tests { use super::*; + use vey_yaml::yaml_doc; #[test] @@ -51,7 +50,7 @@ mod tests { db: 0 "# ); - let config = RedisSourceConfig::parse_yaml_map(yaml.as_hash().unwrap(), None).unwrap(); + let config = RedisSourceConfig::parse_yaml_map(yaml.as_mapping().unwrap(), None).unwrap(); assert_eq!(config.enc_key_name, "tls_ticket_enc"); assert_eq!(config.dec_set_name, "tls_ticket_dec"); } @@ -66,7 +65,7 @@ mod tests { addr: "127.0.0.1:6379" "# ); - assert!(RedisSourceConfig::parse_yaml_map(yaml.as_hash().unwrap(), None).is_err()); + assert!(RedisSourceConfig::parse_yaml_map(yaml.as_mapping().unwrap(), None).is_err()); // Missing dec_set let yaml = yaml_doc!( @@ -76,7 +75,7 @@ mod tests { addr: "127.0.0.1:6379" "# ); - assert!(RedisSourceConfig::parse_yaml_map(yaml.as_hash().unwrap(), None).is_err()); + assert!(RedisSourceConfig::parse_yaml_map(yaml.as_mapping().unwrap(), None).is_err()); // Empty enc_key let yaml = yaml_doc!( @@ -87,7 +86,7 @@ mod tests { addr: "127.0.0.1:6379" "# ); - assert!(RedisSourceConfig::parse_yaml_map(yaml.as_hash().unwrap(), None).is_err()); + assert!(RedisSourceConfig::parse_yaml_map(yaml.as_mapping().unwrap(), None).is_err()); // Empty dec_set let yaml = yaml_doc!( @@ -98,6 +97,6 @@ mod tests { addr: "127.0.0.1:6379" "# ); - assert!(RedisSourceConfig::parse_yaml_map(yaml.as_hash().unwrap(), None).is_err()); + assert!(RedisSourceConfig::parse_yaml_map(yaml.as_mapping().unwrap(), None).is_err()); } } diff --git a/lib/vey-tls-ticket/src/source/yaml.rs b/lib/vey-tls-ticket/src/source/yaml.rs index f8642daba..9b7391ecb 100644 --- a/lib/vey-tls-ticket/src/source/yaml.rs +++ b/lib/vey-tls-ticket/src/source/yaml.rs @@ -6,13 +6,13 @@ use std::path::Path; use anyhow::anyhow; -use yaml_rust::Yaml; +use saphyr::Yaml; use super::{CONFIG_KEY_SOURCE_TYPE, TicketSourceConfig}; impl TicketSourceConfig { pub(crate) fn parse_yaml(value: &Yaml, lookup_dir: Option<&Path>) -> anyhow::Result { - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { let source_type = vey_yaml::hash_get_required_str(map, CONFIG_KEY_SOURCE_TYPE)?; match vey_yaml::key::normalize(source_type).as_str() { @@ -33,6 +33,7 @@ impl TicketSourceConfig { #[cfg(test)] mod tests { use super::*; + use saphyr::Scalar; use vey_yaml::yaml_doc; #[test] @@ -69,19 +70,19 @@ mod tests { ); assert!(TicketSourceConfig::parse_yaml(&yaml, None).is_err()); - let yaml = Yaml::Integer(123); + let yaml = Yaml::Value(Scalar::Integer(123)); assert!(TicketSourceConfig::parse_yaml(&yaml, None).is_err()); - let yaml = Yaml::Boolean(true); + let yaml = Yaml::Value(Scalar::Boolean(true)); assert!(TicketSourceConfig::parse_yaml(&yaml, None).is_err()); - let yaml = Yaml::Array(vec![]); + let yaml = Yaml::Sequence(vec![]); assert!(TicketSourceConfig::parse_yaml(&yaml, None).is_err()); - let yaml = Yaml::Real("1.23".to_string()); + let yaml = Yaml::Value(Scalar::FloatingPoint((1.23_f64).into())); assert!(TicketSourceConfig::parse_yaml(&yaml, None).is_err()); - let yaml = Yaml::Null; + let yaml = Yaml::Value(Scalar::Null); assert!(TicketSourceConfig::parse_yaml(&yaml, None).is_err()); } } diff --git a/lib/vey-udpdump/Cargo.toml b/lib/vey-udpdump/Cargo.toml index 1f3da9fe1..47bac4870 100644 --- a/lib/vey-udpdump/Cargo.toml +++ b/lib/vey-udpdump/Cargo.toml @@ -12,7 +12,7 @@ description = "Capture dump writers for the VEY project" log.workspace = true tokio = { workspace = true, features = ["rt", "net", "sync"] } anyhow = { workspace = true, optional = true } -yaml-rust = { workspace = true, optional = true } +saphyr = { workspace = true, optional = true } vey-types.workspace = true vey-socket.workspace = true vey-io-ext.workspace = true @@ -25,4 +25,4 @@ tokio = { workspace = true, features = ["macros", "rt", "io-util"] } [features] default = [] -yaml = ["dep:vey-yaml", "dep:yaml-rust", "dep:anyhow"] +yaml = ["dep:vey-yaml", "dep:saphyr", "dep:anyhow"] diff --git a/lib/vey-udpdump/src/stream/config/yaml.rs b/lib/vey-udpdump/src/stream/config/yaml.rs index 824fd27cb..65dc67f8e 100644 --- a/lib/vey-udpdump/src/stream/config/yaml.rs +++ b/lib/vey-udpdump/src/stream/config/yaml.rs @@ -4,14 +4,14 @@ */ use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use super::StreamDumpConfig; impl StreamDumpConfig { pub fn parse_yaml(value: &Yaml) -> anyhow::Result { match value { - Yaml::Hash(map) => { + Yaml::Mapping(map) => { let mut config = StreamDumpConfig::default(); vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { @@ -42,7 +42,7 @@ impl StreamDumpConfig { Ok(config) } - Yaml::String(_) => { + Yaml::Value(Scalar::String(_)) => { let config = StreamDumpConfig { peer: vey_yaml::value::as_env_sockaddr(value)?, ..Default::default() @@ -59,8 +59,10 @@ impl StreamDumpConfig { #[cfg(test)] mod tests { use super::*; + use std::net::SocketAddr; use std::str::FromStr; + use vey_yaml::{yaml_doc, yaml_str}; #[test] @@ -157,19 +159,19 @@ mod tests { #[test] fn parse_invalid_yaml_types() { - let yaml = Yaml::Array(vec![]); + let yaml = Yaml::Sequence(vec![]); assert!(StreamDumpConfig::parse_yaml(&yaml).is_err()); - let yaml = Yaml::Integer(123); + let yaml = Yaml::Value(Scalar::Integer(123)); assert!(StreamDumpConfig::parse_yaml(&yaml).is_err()); - let yaml = Yaml::Boolean(true); + let yaml = Yaml::Value(Scalar::Boolean(true)); assert!(StreamDumpConfig::parse_yaml(&yaml).is_err()); - let yaml = Yaml::Real("1.23".to_string()); + let yaml = Yaml::Value(Scalar::FloatingPoint((1.23_f64).into())); assert!(StreamDumpConfig::parse_yaml(&yaml).is_err()); - let yaml = Yaml::Null; + let yaml = Yaml::Value(Scalar::Null); assert!(StreamDumpConfig::parse_yaml(&yaml).is_err()); } } diff --git a/lib/vey-yaml/Cargo.toml b/lib/vey-yaml/Cargo.toml index 0287e9c43..ffc83b0a2 100644 --- a/lib/vey-yaml/Cargo.toml +++ b/lib/vey-yaml/Cargo.toml @@ -10,7 +10,7 @@ description = "YAML configuration helpers for the VEY project" [dependencies] anyhow.workspace = true -yaml-rust.workspace = true +saphyr.workspace = true humanize-rs.workspace = true ascii.workspace = true jiff.workspace = true diff --git a/lib/vey-yaml/src/callback.rs b/lib/vey-yaml/src/callback.rs index 6a9318a69..dd7742f5d 100644 --- a/lib/vey-yaml/src/callback.rs +++ b/lib/vey-yaml/src/callback.rs @@ -3,7 +3,7 @@ * SPDX-FileCopyrightText: 2023-2025 ByteDance and/or its affiliates. */ -use yaml_rust::Yaml; +use saphyr::Yaml; use crate::YamlDocPosition; diff --git a/lib/vey-yaml/src/hash.rs b/lib/vey-yaml/src/hash.rs index 53ddc95f3..7e5b692ee 100644 --- a/lib/vey-yaml/src/hash.rs +++ b/lib/vey-yaml/src/hash.rs @@ -3,50 +3,53 @@ * SPDX-FileCopyrightText: 2023-2025 ByteDance and/or its affiliates. */ +use std::hash::BuildHasher; + use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::{Mapping, Yaml}; + +fn mapping_get<'a, 'input>(map: &'a Mapping<'input>, key: &str) -> Option<&'a Yaml<'input>> { + let hash = map.hasher().hash_one(yaml_str!(key)); + map.raw_entry() + .from_hash(hash, |k| k.as_str() == Some(key)) + .map(|(_, v)| v) +} -pub fn foreach_kv(table: &yaml::Hash, mut f: F) -> anyhow::Result<()> +pub fn foreach_kv(table: &Mapping, mut f: F) -> anyhow::Result<()> where F: FnMut(&str, &Yaml) -> anyhow::Result<()>, { for (k, v) in table.iter() { - if let Yaml::String(key) = k { - f(key, v).context(format!("failed to parse value of key {key}"))?; - } else { + let Some(key) = k.as_str() else { return Err(anyhow!("key in hash should be string")); - } + }; + f(key, v).context(format!("failed to parse value of key {key}"))?; } Ok(()) } -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) { - Some(v) => Ok(v), - None => Err(anyhow!("no required key {k} found in this map")), - } +pub fn get_required<'a, 'input>( + map: &'a Mapping<'input>, + k: &str, +) -> anyhow::Result<&'a Yaml<'input>> { + mapping_get(map, k).ok_or_else(|| anyhow!("no required key {k} found in this map")) } -pub fn get_required_str<'a>(map: &'a yaml::Hash, k: &str) -> anyhow::Result<&'a str> { - let v = get_required(map, k)?; - if let Yaml::String(s) = v { - Ok(s) - } else { - Err(anyhow!("invalid string value for required key {k}")) - } +pub fn get_required_str<'a, 'input>(map: &'a Mapping<'input>, k: &str) -> anyhow::Result<&'a str> { + get_required(map, k)? + .as_str() + .ok_or_else(|| anyhow!("invalid string value for required key {k}")) } -pub fn get_optional_str<'a>(map: &'a yaml::Hash, k: &str) -> anyhow::Result> { - let key = Yaml::String(k.to_owned()); - match map.get(&key) { - Some(v) => { - if let Yaml::String(s) = v { - Ok(Some(s)) - } else { - Err(anyhow!("invalid string value for optional key {k}")) - } - } +pub fn get_optional_str<'a, 'input>( + map: &'a Mapping<'input>, + k: &str, +) -> anyhow::Result> { + match mapping_get(map, k) { + Some(v) => v + .as_str() + .map(Some) + .ok_or_else(|| anyhow!("invalid string value for optional key {k}")), None => Ok(None), } } @@ -58,10 +61,10 @@ mod tests { #[test] fn foreach_kv_ok() { let yaml = yaml_doc!("a: 1\nb: 2"); - let hash = yaml.as_hash().unwrap(); + let hash = yaml.as_mapping().unwrap(); let mut result = Vec::new(); let res = foreach_kv(hash, |k, v| { - result.push((k.to_owned(), v.as_i64().unwrap())); + result.push((k.to_owned(), v.as_integer().unwrap())); Ok(()) }); assert!(res.is_ok()); @@ -71,46 +74,43 @@ mod tests { #[test] fn foreach_kv_err() { let yaml = yaml_doc!("123: 1"); - let hash = yaml.as_hash().unwrap(); + let hash = yaml.as_mapping().unwrap(); assert!(foreach_kv(hash, |_, _| Ok(())).is_err()); let yaml = yaml_doc!("a: 1"); - let hash = yaml.as_hash().unwrap(); + let hash = yaml.as_mapping().unwrap(); assert!(foreach_kv(hash, |k, _| Err(anyhow!("error at {}", k))).is_err()); } #[test] fn get_required_ok() { let yaml = yaml_doc!("key: value"); - let hash = yaml.as_hash().unwrap(); - assert_eq!( - get_required(hash, "key").unwrap(), - &Yaml::String("value".to_string()) - ); + let hash = yaml.as_mapping().unwrap(); + assert_eq!(get_required(hash, "key").unwrap(), &yaml_str!("value")); } #[test] fn get_required_err() { let yaml = yaml_doc!("key: value"); - let hash = yaml.as_hash().unwrap(); + let hash = yaml.as_mapping().unwrap(); assert!(get_required(hash, "missing").is_err()); } #[test] fn get_required_str_ok() { let yaml = yaml_doc!("key: value"); - let hash = yaml.as_hash().unwrap(); + let hash = yaml.as_mapping().unwrap(); assert_eq!(get_required_str(hash, "key").unwrap(), "value"); } #[test] fn get_required_str_err() { let yaml = yaml_doc!("key: value"); - let hash = yaml.as_hash().unwrap(); + let hash = yaml.as_mapping().unwrap(); assert!(get_required_str(hash, "missing").is_err()); let yaml = yaml_doc!("key: 123"); - let hash = yaml.as_hash().unwrap(); + let hash = yaml.as_mapping().unwrap(); assert!(get_required_str(hash, "key").is_err()); } } diff --git a/lib/vey-yaml/src/humanize/size.rs b/lib/vey-yaml/src/humanize/size.rs index c3897be1f..b2421b3df 100644 --- a/lib/vey-yaml/src/humanize/size.rs +++ b/lib/vey-yaml/src/humanize/size.rs @@ -6,12 +6,12 @@ use anyhow::anyhow; use humanize_rs::bytes::Bytes; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; pub fn as_usize(v: &Yaml) -> anyhow::Result { match v { - Yaml::String(value) => parse_bytes(value), - Yaml::Integer(value) => Ok(usize::try_from(*value)?), + Yaml::Value(Scalar::String(value)) => parse_bytes(value), + Yaml::Value(Scalar::Integer(value)) => Ok(usize::try_from(*value)?), _ => Err(anyhow!( "yaml value type for humanize usize should be 'string' or 'integer'" )), @@ -20,8 +20,8 @@ pub fn as_usize(v: &Yaml) -> anyhow::Result { pub fn as_u64(v: &Yaml) -> anyhow::Result { match v { - Yaml::String(value) => parse_bytes(value), - Yaml::Integer(value) => Ok(u64::try_from(*value)?), + Yaml::Value(Scalar::String(value)) => parse_bytes(value), + Yaml::Value(Scalar::Integer(value)) => Ok(u64::try_from(*value)?), _ => Err(anyhow!( "yaml value type for humanize u64 should be 'string' or 'integer'" )), @@ -30,8 +30,8 @@ pub fn as_u64(v: &Yaml) -> anyhow::Result { pub fn as_u32(v: &Yaml) -> anyhow::Result { match v { - Yaml::String(value) => parse_bytes(value), - Yaml::Integer(value) => Ok(u32::try_from(*value)?), + Yaml::Value(Scalar::String(value)) => parse_bytes(value), + Yaml::Value(Scalar::Integer(value)) => Ok(u32::try_from(*value)?), _ => Err(anyhow!( "yaml value type for humanize u32 should be 'string' or 'integer'" )), @@ -40,8 +40,8 @@ pub fn as_u32(v: &Yaml) -> anyhow::Result { pub fn as_u16(v: &Yaml) -> anyhow::Result { match v { - Yaml::String(value) => parse_bytes(value), - Yaml::Integer(value) => Ok(u16::try_from(*value)?), + Yaml::Value(Scalar::String(value)) => parse_bytes(value), + Yaml::Value(Scalar::Integer(value)) => Ok(u16::try_from(*value)?), _ => Err(anyhow!( "yaml value type for humanize u16 should be 'string' or 'integer'" )), @@ -76,19 +76,19 @@ mod tests { let v = yaml_str!("1KiB"); assert_eq!(as_usize(&v).unwrap(), 1024); - let v = Yaml::Integer(1024); + let v = Yaml::Value(Scalar::Integer(1024)); assert_eq!(as_usize(&v).unwrap(), 1024); } #[test] fn as_usize_err() { - let v = Yaml::Integer(-1024); + let v = Yaml::Value(Scalar::Integer(-1024)); assert!(as_usize(&v).is_err()); - let v = Yaml::Real("1.01".to_string()); + let v = Yaml::Value(Scalar::FloatingPoint((1.01_f64).into())); assert!(as_usize(&v).is_err()); - let v = Yaml::Array(vec![Yaml::Integer(1)]); + let v = Yaml::Sequence(vec![Yaml::Value(Scalar::Integer(1))]); assert!(as_usize(&v).is_err()); } @@ -97,19 +97,19 @@ mod tests { let v = yaml_str!("2000"); assert_eq!(as_u64(&v).unwrap(), 2000); - let v = Yaml::Integer(2048); + let v = Yaml::Value(Scalar::Integer(2048)); assert_eq!(as_u64(&v).unwrap(), 2048); } #[test] fn as_u64_err() { - let v = Yaml::Integer(-2048); + let v = Yaml::Value(Scalar::Integer(-2048)); assert!(as_u64(&v).is_err()); - let v = Yaml::Real("2.02".to_string()); + let v = Yaml::Value(Scalar::FloatingPoint((2.02_f64).into())); assert!(as_u64(&v).is_err()); - let v = Yaml::Boolean(true); + let v = Yaml::Value(Scalar::Boolean(true)); assert!(as_u64(&v).is_err()); } @@ -118,19 +118,19 @@ mod tests { let v = yaml_str!("4000"); assert_eq!(as_u32(&v).unwrap(), 4000); - let v = Yaml::Integer(4096); + let v = Yaml::Value(Scalar::Integer(4096)); assert_eq!(as_u32(&v).unwrap(), 4096); } #[test] fn as_u32_err() { - let v = Yaml::Integer(-4096); + let v = Yaml::Value(Scalar::Integer(-4096)); assert!(as_u32(&v).is_err()); - let v = Yaml::Real("4.04".to_string()); + let v = Yaml::Value(Scalar::FloatingPoint((4.04_f64).into())); assert!(as_u32(&v).is_err()); - let v = Yaml::Null; + let v = Yaml::Value(Scalar::Null); assert!(as_u32(&v).is_err()); } @@ -139,19 +139,19 @@ mod tests { let v = yaml_str!("4000"); assert_eq!(as_u16(&v).unwrap(), 4000); - let v = Yaml::Integer(4096); + let v = Yaml::Value(Scalar::Integer(4096)); assert_eq!(as_u16(&v).unwrap(), 4096); } #[test] fn as_u16_err() { - let v = Yaml::Integer(-4096); + let v = Yaml::Value(Scalar::Integer(-4096)); assert!(as_u16(&v).is_err()); - let v = Yaml::Real("4.04".to_string()); + let v = Yaml::Value(Scalar::FloatingPoint((4.04_f64).into())); assert!(as_u16(&v).is_err()); - let v = Yaml::Null; + let v = Yaml::Value(Scalar::Null); assert!(as_u16(&v).is_err()); } @@ -159,7 +159,7 @@ mod tests { fn non_ascii_string_is_err() { // Non-ASCII is rejected before parse. `1·K`, `100°C`, and `1K` used to panic. for input in ["1·K", "100°C", "1K", "·1K", "1K", "1\u{00A0}KiB"] { - let v = Yaml::String(input.to_string()); + let v = yaml_str!(input); assert!(as_usize(&v).is_err(), "{input}"); assert!(as_u64(&v).is_err(), "{input}"); assert!(as_u32(&v).is_err(), "{input}"); diff --git a/lib/vey-yaml/src/humanize/time.rs b/lib/vey-yaml/src/humanize/time.rs index f6bf74c71..73f3649e1 100644 --- a/lib/vey-yaml/src/humanize/time.rs +++ b/lib/vey-yaml/src/humanize/time.rs @@ -8,11 +8,11 @@ use std::time::Duration; use anyhow::anyhow; use humanize_rs::ParseError; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; pub fn as_duration(v: &Yaml) -> anyhow::Result { match v { - Yaml::String(value) => match humanize_rs::duration::parse(value) { + Yaml::Value(Scalar::String(value)) => match humanize_rs::duration::parse(value) { Ok(v) => Ok(v), Err(ParseError::MissingUnit) => { if let Ok(u) = u64::from_str(value) { @@ -25,16 +25,15 @@ pub fn as_duration(v: &Yaml) -> anyhow::Result { } Err(e) => Err(anyhow!("invalid humanize duration string: {e}")), }, - Yaml::Integer(value) => { + Yaml::Value(Scalar::Integer(value)) => { if let Ok(u) = u64::try_from(*value) { Ok(Duration::from_secs(u)) } else { Err(anyhow!("unsupported duration string")) } } - Yaml::Real(s) => { - let f = f64::from_str(s).map_err(|e| anyhow!("invalid f64 value: {e}"))?; - Duration::try_from_secs_f64(f).map_err(anyhow::Error::new) + Yaml::Value(Scalar::FloatingPoint(n)) => { + Duration::try_from_secs_f64(**n).map_err(anyhow::Error::new) } _ => Err(anyhow!( "yaml value type for humanize duration should be 'string' or 'integer' or 'real'" @@ -54,10 +53,10 @@ mod tests { let v = yaml_str!("1000"); assert_eq!(as_duration(&v).unwrap(), Duration::from_secs(1000)); - let v = Yaml::Integer(1000); + let v = Yaml::Value(Scalar::Integer(1000)); assert_eq!(as_duration(&v).unwrap(), Duration::from_secs(1000)); - let v = Yaml::Real("1.01".to_string()); + let v = Yaml::Value(Scalar::FloatingPoint((1.01_f64).into())); assert_eq!( as_duration(&v).unwrap(), Duration::try_from_secs_f64(1.01).unwrap() @@ -81,10 +80,10 @@ mod tests { let v = yaml_str!("abc"); assert!(as_duration(&v).is_err()); - let v = Yaml::Integer(-1000); + let v = Yaml::Value(Scalar::Integer(-1000)); assert!(as_duration(&v).is_err()); - let v = Yaml::Array(vec![Yaml::Integer(1)]); + let v = Yaml::Sequence(vec![Yaml::Value(Scalar::Integer(1))]); assert!(as_duration(&v).is_err()); } } diff --git a/lib/vey-yaml/src/hybrid.rs b/lib/vey-yaml/src/hybrid.rs index cf9c4ba4d..a20efcec4 100644 --- a/lib/vey-yaml/src/hybrid.rs +++ b/lib/vey-yaml/src/hybrid.rs @@ -8,7 +8,7 @@ use std::ffi::{OsStr, OsString}; use std::path::{Path, PathBuf}; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::{Scalar, Yaml}; use super::YamlDocPosition; @@ -27,13 +27,13 @@ impl HybridParser { pub fn foreach_map(&self, value: &Yaml, f: F) -> anyhow::Result<()> where - F: Fn(&yaml::Hash, Option) -> anyhow::Result<()>, + F: Fn(&saphyr::Mapping, Option) -> anyhow::Result<()>, { match value { - Yaml::String(path) => self.load_path(path, &f).context(format!( + Yaml::Value(Scalar::String(path)) => self.load_path(path, &f).context(format!( "value is a string {path}, which should be a valid path", ))?, - Yaml::Array(seq) => self + Yaml::Sequence(seq) => self .load_array(seq, &f) .context(format!("value is an array, with {} objects", seq.len()))?, _ => return Err(anyhow!("value should be a path or an array")), @@ -53,14 +53,14 @@ impl HybridParser { fn load_array(&self, entries: &[Yaml], f: &F) -> anyhow::Result<()> where - F: Fn(&yaml::Hash, Option) -> anyhow::Result<()>, + F: Fn(&saphyr::Mapping, Option) -> anyhow::Result<()>, { for (i, entry) in entries.iter().enumerate() { match entry { - Yaml::String(path) => self + Yaml::Value(Scalar::String(path)) => self .load_path(path, f) .context(format!("#{i}: failed to load path {path}"))?, - Yaml::Hash(value) => { + Yaml::Mapping(value) => { f(value, None).context(format!("#{i}: failed to load map {value:?}"))? } _ => return Err(anyhow!("#{i}: value should be a path or a map")), @@ -71,7 +71,7 @@ impl HybridParser { fn load_path(&self, path: &str, f: &F) -> anyhow::Result<()> where - F: Fn(&yaml::Hash, Option) -> anyhow::Result<()>, + F: Fn(&saphyr::Mapping, Option) -> anyhow::Result<()>, { let path = self.get_final_path(path)?; if path.is_dir() { @@ -95,7 +95,7 @@ impl HybridParser { fn load_dir(&self, path: &Path, f: &F) -> anyhow::Result<()> where - F: Fn(&yaml::Hash, Option) -> anyhow::Result<()>, + F: Fn(&saphyr::Mapping, Option) -> anyhow::Result<()>, { for d_entry in std::fs::read_dir(path)? { let d_entry = d_entry?; @@ -136,10 +136,10 @@ impl HybridParser { fn load_file(&self, path: &Path, f: &F) -> anyhow::Result<()> where - F: Fn(&yaml::Hash, Option) -> anyhow::Result<()>, + F: Fn(&saphyr::Mapping, Option) -> anyhow::Result<()>, { super::foreach_doc(path, |i, doc| match doc { - Yaml::Hash(value) => { + Yaml::Mapping(value) => { let position = YamlDocPosition { path: PathBuf::from(path), index: i, @@ -158,10 +158,12 @@ impl HybridParser { #[cfg(test)] mod tests { use super::*; + use std::fs; use std::io::Write; use std::sync::atomic::{AtomicUsize, Ordering}; - use yaml_rust::yaml::Hash; + + use saphyr::Mapping; static TEST_DIR_COUNTER: AtomicUsize = AtomicUsize::new(0); @@ -216,29 +218,23 @@ mod tests { // String path create_test_file(&test_dir, "test.yaml", "key1: value1\nkey2: value2\n"); - let yaml_path = Yaml::String("test.yaml".to_string()); + let yaml_path = yaml_str!("test.yaml"); let result = parser.foreach_map(&yaml_path, |hash, position| { - assert!(hash.contains_key(&Yaml::String("key1".to_string()))); + assert!(hash.contains_key(&yaml_str!("key1"))); assert!(position.is_some()); Ok(()) }); assert!(result.is_ok()); // Array value - let mut direct_hash = Hash::new(); - direct_hash.insert( - Yaml::String("direct".to_string()), - Yaml::String("value".to_string()), - ); - let yaml_array = Yaml::Array(vec![ - Yaml::String("test.yaml".to_string()), - Yaml::Hash(direct_hash), - ]); + let mut direct_hash = Mapping::new(); + direct_hash.insert(yaml_str!("direct"), yaml_str!("value")); + let yaml_array = Yaml::Sequence(vec![yaml_str!("test.yaml"), Yaml::Mapping(direct_hash)]); let result = parser.foreach_map(&yaml_array, |_, _| Ok(())); assert!(result.is_ok()); // Invalid value type - let yaml_int = Yaml::Integer(42); + let yaml_int = Yaml::Value(Scalar::Integer(42)); let result = parser.foreach_map(&yaml_int, |_, _| Ok(())); assert!(result.is_err()); } @@ -271,20 +267,14 @@ mod tests { // Mixed content create_test_file(&test_dir, "test.yaml", "file_key: file_value"); - let mut direct_hash = Hash::new(); - direct_hash.insert( - Yaml::String("hash_key".to_string()), - Yaml::String("hash_value".to_string()), - ); - let entries = vec![ - Yaml::String("test.yaml".to_string()), - Yaml::Hash(direct_hash), - ]; + let mut direct_hash = Mapping::new(); + direct_hash.insert(yaml_str!("hash_key"), yaml_str!("hash_value")); + let entries = vec![yaml_str!("test.yaml"), Yaml::Mapping(direct_hash)]; let result = parser.load_array(&entries, &|_, _| Ok(())); assert!(result.is_ok()); // Invalid entry - let entries = vec![Yaml::Integer(42)]; + let entries = vec![Yaml::Value(Scalar::Integer(42))]; let result = parser.load_array(&entries, &|_, _| Ok(())); assert!(result.is_err()); } @@ -359,17 +349,17 @@ mod tests { // Path validation error create_test_file(&test_dir, "test.yaml", "key: value"); - let yaml_path = Yaml::String("test.yaml".to_string()); + let yaml_path = yaml_str!("test.yaml"); let result = parser.foreach_map(&yaml_path, |_, _| Err(anyhow!("callback error"))); assert!(result.is_err()); // String path error context - let yaml_path = Yaml::String("nonexistent.yaml".to_string()); + let yaml_path = yaml_str!("nonexistent.yaml"); let result = parser.foreach_map(&yaml_path, |_, _| Ok(())); assert!(result.is_err()); // Array error context - let yaml_array = Yaml::Array(vec![Yaml::String("nonexistent.yaml".to_string())]); + let yaml_array = Yaml::Sequence(vec![yaml_str!("nonexistent.yaml")]); let result = parser.foreach_map(&yaml_array, |_, _| Ok(())); assert!(result.is_err()); } diff --git a/lib/vey-yaml/src/macros.rs b/lib/vey-yaml/src/macros.rs index 27d6f5358..7823c0f12 100644 --- a/lib/vey-yaml/src/macros.rs +++ b/lib/vey-yaml/src/macros.rs @@ -5,26 +5,31 @@ #[macro_export] macro_rules! yaml_str { - ($s:literal) => { - Yaml::String($s.to_string()) + ($s:expr) => { + ::saphyr::Yaml::Value(::saphyr::Scalar::String(::std::borrow::Cow::Borrowed($s))) }; } #[macro_export] macro_rules! yaml_doc { - ($s:literal) => { - yaml_rust::YamlLoader::load_from_str($s).unwrap().remove(0) - }; + ($s:literal) => {{ + use ::saphyr::LoadableYamlNode as _; + ::saphyr::Yaml::load_from_str($s).unwrap().remove(0) + }}; } #[cfg(test)] mod tests { - use yaml_rust::Yaml; + use saphyr::{Scalar, Yaml}; #[test] fn yaml_str() { let v = yaml_str!("1234"); - assert!(matches!(v, Yaml::String(_))); + assert!(matches!(v, Yaml::Value(Scalar::String(_)))); + + let path = "absolute_path"; + let v = yaml_str!(path); + assert_eq!(v.as_str(), Some(path)); } #[test] @@ -34,7 +39,7 @@ mod tests { key1: v1 "# ); - assert!(matches!(v, Yaml::Hash(_))); + assert!(matches!(v, Yaml::Mapping(_))); let v = yaml_doc!( r#" @@ -42,15 +47,15 @@ mod tests { - v2 "# ); - assert!(matches!(v, Yaml::Array(_))); + assert!(matches!(v, Yaml::Sequence(_))); let v = yaml_doc!("1234"); - assert!(matches!(v, Yaml::Integer(1234))); + assert!(matches!(v, Yaml::Value(Scalar::Integer(1234)))); let v = yaml_doc!("1.0"); - assert!(matches!(v, Yaml::Real(_))); + assert!(matches!(v, Yaml::Value(Scalar::FloatingPoint(_)))); let v = yaml_doc!(r#""1234""#); - assert!(matches!(v, Yaml::String(_))); + assert!(matches!(v, Yaml::Value(Scalar::String(_)))); } } diff --git a/lib/vey-yaml/src/util.rs b/lib/vey-yaml/src/util.rs index 4a47570a4..e5c1bc103 100644 --- a/lib/vey-yaml/src/util.rs +++ b/lib/vey-yaml/src/util.rs @@ -11,7 +11,7 @@ use std::path::{Path, PathBuf}; use std::str::FromStr; use anyhow::anyhow; -use yaml_rust::{Yaml, YamlLoader}; +use saphyr::{LoadableYamlNode, Yaml}; #[derive(Clone, Debug, Eq, PartialEq)] pub struct YamlDocPosition { @@ -72,11 +72,11 @@ impl fmt::Display for YamlDocPosition { } } -pub fn load_doc(position: &YamlDocPosition) -> anyhow::Result { +pub fn load_doc(position: &YamlDocPosition) -> anyhow::Result> { let mut conf = String::new(); File::open(&position.path)?.read_to_string(&mut conf)?; - let mut yaml_docs = YamlLoader::load_from_str(&conf)?; + let mut yaml_docs = Yaml::load_from_str(&conf)?; if yaml_docs.get(position.index).is_some() { Ok(yaml_docs.remove(position.index)) } else { @@ -91,7 +91,7 @@ where let mut conf = String::new(); File::open(path)?.read_to_string(&mut conf)?; - let yaml_docs = YamlLoader::load_from_str(&conf)?; + let yaml_docs = Yaml::load_from_str(&conf)?; for (i, doc) in yaml_docs.iter().enumerate() { f(i, doc)?; } diff --git a/lib/vey-yaml/src/value/acl/exact_host.rs b/lib/vey-yaml/src/value/acl/exact_host.rs index 78a9ab8aa..b375b50b2 100644 --- a/lib/vey-yaml/src/value/acl/exact_host.rs +++ b/lib/vey-yaml/src/value/acl/exact_host.rs @@ -3,7 +3,7 @@ * SPDX-FileCopyrightText: 2023-2025 ByteDance and/or its affiliates. */ -use yaml_rust::Yaml; +use saphyr::Yaml; use vey_types::acl::{AclAction, AclExactHostRule}; diff --git a/lib/vey-yaml/src/value/acl/exact_port.rs b/lib/vey-yaml/src/value/acl/exact_port.rs index 77ee702db..d8d29d1e0 100644 --- a/lib/vey-yaml/src/value/acl/exact_port.rs +++ b/lib/vey-yaml/src/value/acl/exact_port.rs @@ -3,7 +3,7 @@ * SPDX-FileCopyrightText: 2023-2025 ByteDance and/or its affiliates. */ -use yaml_rust::Yaml; +use saphyr::Yaml; use vey_types::acl::{AclAction, AclExactPortRule}; diff --git a/lib/vey-yaml/src/value/acl/mod.rs b/lib/vey-yaml/src/value/acl/mod.rs index 586ea148f..8c4e117bc 100644 --- a/lib/vey-yaml/src/value/acl/mod.rs +++ b/lib/vey-yaml/src/value/acl/mod.rs @@ -7,7 +7,7 @@ use std::str::FromStr; use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_types::acl::AclAction; @@ -32,7 +32,7 @@ pub use regex_set::as_regex_set_rule_builder; pub use user_agent::as_user_agent_rule; fn as_action(value: &Yaml) -> anyhow::Result { - if let Yaml::String(s) = value { + if let Yaml::Value(Scalar::String(s)) = value { let action = AclAction::from_str(s).map_err(|_| anyhow!("invalid AclAction string value"))?; Ok(action) @@ -50,7 +50,7 @@ trait AclRuleYamlParser { fn parse(&mut self, value: &Yaml) -> anyhow::Result<()> { match value { - Yaml::Hash(map) => { + Yaml::Mapping(map) => { crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { "default" => { let action = as_action(v).context(format!("invalid value for key {k}"))?; @@ -60,7 +60,7 @@ trait AclRuleYamlParser { _ => { let action = AclAction::from_str(k) .map_err(|_| anyhow!("the key {k} is not a valid AclAction"))?; - if let Yaml::Array(seq) = v { + if let Yaml::Sequence(seq) = v { for (i, v) in seq.iter().enumerate() { self.add_rule_for_action(action, v) .context(format!("invalid value for {k}#{i}"))?; @@ -73,7 +73,7 @@ trait AclRuleYamlParser { } })?; } - Yaml::Array(seq) => { + Yaml::Sequence(seq) => { for (i, v) in seq.iter().enumerate() { self.add_rule_for_action(self.get_default_found_action(), v) .context(format!("invalid value for element #{i}"))?; diff --git a/lib/vey-yaml/src/value/acl/network.rs b/lib/vey-yaml/src/value/acl/network.rs index c440613b1..da040e50f 100644 --- a/lib/vey-yaml/src/value/acl/network.rs +++ b/lib/vey-yaml/src/value/acl/network.rs @@ -3,7 +3,7 @@ * SPDX-FileCopyrightText: 2023-2025 ByteDance and/or its affiliates. */ -use yaml_rust::Yaml; +use saphyr::Yaml; use vey_types::acl::{AclAction, AclNetworkRuleBuilder}; diff --git a/lib/vey-yaml/src/value/acl/proxy_request.rs b/lib/vey-yaml/src/value/acl/proxy_request.rs index e3ff4a4e6..be0d427d8 100644 --- a/lib/vey-yaml/src/value/acl/proxy_request.rs +++ b/lib/vey-yaml/src/value/acl/proxy_request.rs @@ -3,7 +3,7 @@ * SPDX-FileCopyrightText: 2023-2025 ByteDance and/or its affiliates. */ -use yaml_rust::Yaml; +use saphyr::Yaml; use vey_types::acl::{AclAction, AclProxyRequestRule}; diff --git a/lib/vey-yaml/src/value/acl/regex_domain.rs b/lib/vey-yaml/src/value/acl/regex_domain.rs index 137114bde..02891794c 100644 --- a/lib/vey-yaml/src/value/acl/regex_domain.rs +++ b/lib/vey-yaml/src/value/acl/regex_domain.rs @@ -5,7 +5,7 @@ */ use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_types::acl::{AclAction, AclRegexDomainRuleBuilder}; @@ -24,7 +24,7 @@ impl AclRuleYamlParser for AclRegexDomainRuleBuilder { fn add_rule_for_action(&mut self, action: AclAction, value: &Yaml) -> anyhow::Result<()> { match value { - Yaml::Hash(map) => { + Yaml::Mapping(map) => { let mut regex_list = vec![]; let mut suffix_domain = None; @@ -53,7 +53,7 @@ impl AclRuleYamlParser for AclRegexDomainRuleBuilder { Ok(()) } - Yaml::String(_) => { + Yaml::Value(Scalar::String(_)) => { let regex = crate::value::as_regex(value)?; self.add_full_regex(®ex, action); Ok(()) diff --git a/lib/vey-yaml/src/value/acl/regex_set.rs b/lib/vey-yaml/src/value/acl/regex_set.rs index e06a7bbed..0818c338e 100644 --- a/lib/vey-yaml/src/value/acl/regex_set.rs +++ b/lib/vey-yaml/src/value/acl/regex_set.rs @@ -4,7 +4,7 @@ */ use anyhow::anyhow; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_types::acl::{AclAction, AclRegexSetRuleBuilder}; @@ -23,7 +23,7 @@ impl AclRuleYamlParser for AclRegexSetRuleBuilder { fn add_rule_for_action(&mut self, action: AclAction, value: &Yaml) -> anyhow::Result<()> { match value { - Yaml::String(_) => { + Yaml::Value(Scalar::String(_)) => { let regex = crate::value::as_regex(value)?; self.add_regex(®ex, action); Ok(()) diff --git a/lib/vey-yaml/src/value/acl/suffix_domain.rs b/lib/vey-yaml/src/value/acl/suffix_domain.rs index 756bda864..27ded423b 100644 --- a/lib/vey-yaml/src/value/acl/suffix_domain.rs +++ b/lib/vey-yaml/src/value/acl/suffix_domain.rs @@ -5,7 +5,7 @@ */ use anyhow::anyhow; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_types::acl::{AclAction, AclSuffixDomainRuleBuilder}; @@ -24,7 +24,7 @@ impl AclRuleYamlParser for AclSuffixDomainRuleBuilder { fn add_rule_for_action(&mut self, action: AclAction, value: &Yaml) -> anyhow::Result<()> { match value { - Yaml::String(_) => { + Yaml::Value(Scalar::String(_)) => { let host = crate::value::as_domain(value)?; self.add_node(&host, action); Ok(()) diff --git a/lib/vey-yaml/src/value/acl/user_agent.rs b/lib/vey-yaml/src/value/acl/user_agent.rs index 1fbc70163..d61fb8e15 100644 --- a/lib/vey-yaml/src/value/acl/user_agent.rs +++ b/lib/vey-yaml/src/value/acl/user_agent.rs @@ -4,7 +4,7 @@ */ use anyhow::Context; -use yaml_rust::Yaml; +use saphyr::Yaml; use vey_types::acl::{AclAction, AclUserAgentRule}; diff --git a/lib/vey-yaml/src/value/acl_set/dst_host.rs b/lib/vey-yaml/src/value/acl_set/dst_host.rs index 0faca8f09..84e973b21 100644 --- a/lib/vey-yaml/src/value/acl_set/dst_host.rs +++ b/lib/vey-yaml/src/value/acl_set/dst_host.rs @@ -5,12 +5,12 @@ */ use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::Yaml; use vey_types::acl_set::AclDstHostRuleSetBuilder; pub fn as_dst_host_rule_set_builder(value: &Yaml) -> anyhow::Result { - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { let mut builder = AclDstHostRuleSetBuilder::default(); crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { diff --git a/lib/vey-yaml/src/value/auth/basic.rs b/lib/vey-yaml/src/value/auth/basic.rs index f914a0150..a93299b22 100644 --- a/lib/vey-yaml/src/value/auth/basic.rs +++ b/lib/vey-yaml/src/value/auth/basic.rs @@ -4,12 +4,12 @@ */ use anyhow::anyhow; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_types::auth::{Password, Username}; pub fn as_username(value: &Yaml) -> anyhow::Result { - if let Yaml::String(s) = value { + if let Yaml::Value(Scalar::String(s)) = value { Ok(Username::from_original(s)?) } else { Err(anyhow!("yaml value type for username should be string")) @@ -17,7 +17,7 @@ pub fn as_username(value: &Yaml) -> anyhow::Result { } pub fn as_password(value: &Yaml) -> anyhow::Result { - if let Yaml::String(s) = value { + if let Yaml::Value(Scalar::String(s)) = value { Ok(Password::from_original(s)?) } else { Err(anyhow!("yaml value type for password should be string")) @@ -36,14 +36,14 @@ mod tests { // valid maximum length (255) let max_len_username = "a".repeat(255); - let yaml = Yaml::String(max_len_username.to_string()); + let yaml = yaml_str!(&max_len_username); assert_eq!(as_username(&yaml).unwrap().as_original(), max_len_username); } #[test] fn as_username_err() { // non-string type (integer) - let yaml = Yaml::Integer(123); + let yaml = Yaml::Value(Scalar::Integer(123)); assert!(as_username(&yaml).is_err()); // colon in username @@ -52,7 +52,7 @@ mod tests { // exceeding maximum length (256) let too_long_username = "a".repeat(256); - let yaml = Yaml::String(too_long_username.to_string()); + let yaml = yaml_str!(&too_long_username); assert!(as_username(&yaml).is_err()); } @@ -67,19 +67,19 @@ mod tests { // maximum length (255) let max_len_password = "b".repeat(255); - let yaml = Yaml::String(max_len_password.to_string()); + let yaml = yaml_str!(&max_len_password); assert_eq!(as_password(&yaml).unwrap().as_original(), max_len_password); } #[test] fn as_password_err() { // non-string type (boolean) - let yaml = Yaml::Boolean(true); + let yaml = Yaml::Value(Scalar::Boolean(true)); assert!(as_password(&yaml).is_err()); // exceeding maximum length (256) let too_long_password = "b".repeat(256); - let yaml = Yaml::String(too_long_password.to_string()); + let yaml = yaml_str!(&too_long_password); assert!(as_password(&yaml).is_err()); } } diff --git a/lib/vey-yaml/src/value/auth/facts.rs b/lib/vey-yaml/src/value/auth/facts.rs index 878df589c..8aa5e7e34 100644 --- a/lib/vey-yaml/src/value/auth/facts.rs +++ b/lib/vey-yaml/src/value/auth/facts.rs @@ -6,12 +6,12 @@ use std::str::FromStr; use anyhow::anyhow; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_types::auth::{FactsMatchType, FactsMatchValue}; pub fn as_facts_match_type(value: &Yaml) -> anyhow::Result { - if let Yaml::String(s) = value { + if let Yaml::Value(Scalar::String(s)) = value { Ok(FactsMatchType::from_str(s)?) } else { Err(anyhow!( @@ -22,7 +22,7 @@ pub fn as_facts_match_type(value: &Yaml) -> anyhow::Result { pub fn as_facts_match_value(value: &Yaml) -> anyhow::Result { match value { - Yaml::String(s) => { + Yaml::Value(Scalar::String(s)) => { let Some((k, v)) = s.split_once(':') else { return Err(anyhow!( "the FactsMatchValue string value should be of 'key:value' format" @@ -30,16 +30,16 @@ pub fn as_facts_match_value(value: &Yaml) -> anyhow::Result { }; FactsMatchValue::new(k.trim_end(), v.trim_start()) } - Yaml::Hash(map) => { + Yaml::Mapping(map) => { let Some((k, v)) = map.iter().next() else { return Err(anyhow!( "the FactsMatchValue map value should have exactly one key" )); }; - let Yaml::String(k) = k else { + let Yaml::Value(Scalar::String(k)) = k else { return Err(anyhow!("the key in FactsMatchValue map should be a string")); }; - let Yaml::String(v) = v else { + let Yaml::Value(Scalar::String(v)) = v else { return Err(anyhow!( "the value in FactsMatchValue map should be a string" )); diff --git a/lib/vey-yaml/src/value/collection.rs b/lib/vey-yaml/src/value/collection.rs index 4f263f1bc..71986b344 100644 --- a/lib/vey-yaml/src/value/collection.rs +++ b/lib/vey-yaml/src/value/collection.rs @@ -6,12 +6,12 @@ use std::str::FromStr; use anyhow::anyhow; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_types::collection::SelectivePickPolicy; pub fn as_selective_pick_policy(value: &Yaml) -> anyhow::Result { - if let Yaml::String(s) = value { + if let Yaml::Value(Scalar::String(s)) = value { let pick_policy = SelectivePickPolicy::from_str(s).map_err(|_| anyhow!("invalid pick policy"))?; Ok(pick_policy) @@ -76,10 +76,10 @@ mod tests { assert!(as_selective_pick_policy(&value).is_err()); // non-string value - let value = Yaml::Integer(1); + let value = Yaml::Value(Scalar::Integer(1)); assert!(as_selective_pick_policy(&value).is_err()); - let value = Yaml::Boolean(true); + let value = Yaml::Value(Scalar::Boolean(true)); assert!(as_selective_pick_policy(&value).is_err()); } } diff --git a/lib/vey-yaml/src/value/datetime.rs b/lib/vey-yaml/src/value/datetime.rs index af002d999..a574347f3 100644 --- a/lib/vey-yaml/src/value/datetime.rs +++ b/lib/vey-yaml/src/value/datetime.rs @@ -6,13 +6,13 @@ use anyhow::anyhow; use jiff::Timestamp; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_datetime::DateTimeParseExt; pub fn as_rfc3339_datetime(value: &Yaml) -> anyhow::Result { match value { - Yaml::String(s) => { + Yaml::Value(Scalar::String(s)) => { Timestamp::parse_rfc3339(s).map_err(|e| anyhow!("invalid rfc3339 datetime string: {e}")) } _ => Err(anyhow!( @@ -69,10 +69,10 @@ mod tests { let value = yaml_str!("2024-03-01T25:00:00Z"); assert!(as_rfc3339_datetime(&value).is_err()); - let value = Yaml::Integer(12345); + let value = Yaml::Value(Scalar::Integer(12345)); assert!(as_rfc3339_datetime(&value).is_err()); - let value = Yaml::Boolean(true); + let value = Yaml::Value(Scalar::Boolean(true)); assert!(as_rfc3339_datetime(&value).is_err()); } } diff --git a/lib/vey-yaml/src/value/dpi/http.rs b/lib/vey-yaml/src/value/dpi/http.rs index 3bde9e2d1..4bc568256 100644 --- a/lib/vey-yaml/src/value/dpi/http.rs +++ b/lib/vey-yaml/src/value/dpi/http.rs @@ -6,12 +6,12 @@ use anyhow::{Context, anyhow}; use log::warn; -use yaml_rust::Yaml; +use saphyr::Yaml; use vey_dpi::{H1InterceptionConfig, H2InterceptionConfig}; pub fn as_h1_interception_config(value: &Yaml) -> anyhow::Result { - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { let mut config = H1InterceptionConfig::default(); crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { @@ -65,7 +65,7 @@ pub fn as_h1_interception_config(value: &Yaml) -> anyhow::Result anyhow::Result { - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { let mut config = H2InterceptionConfig::default(); crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { @@ -145,6 +145,7 @@ pub fn as_h2_interception_config(value: &Yaml) -> anyhow::Result anyhow::Result { - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { let mut config = ImapInterceptionConfig::default(); crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { @@ -59,6 +59,7 @@ pub fn as_imap_interception_config(value: &Yaml) -> anyhow::Result anyhow::Result<()> { - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { "ftp_greeting_msg" | "ftp_server_greeting_msg" => { let size = crate::humanize::as_usize(v) @@ -57,7 +57,7 @@ pub fn parse_inspect_size_limit( } pub fn as_protocol_inspection_config(value: &Yaml) -> anyhow::Result { - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { let mut config = ProtocolInspectionConfig::default(); crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { @@ -101,6 +101,7 @@ pub fn as_protocol_inspection_config(value: &Yaml) -> anyhow::Result anyhow::Result<()>; fn parse(&mut self, value: &Yaml) -> anyhow::Result<()> { - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { crate::foreach_kv(map, |k, v| { let action = ProtocolInspectAction::from_str(k) .map_err(|_| anyhow!("the key {k} is not a valid inspect action"))?; - if let Yaml::Array(seq) = v { + if let Yaml::Sequence(seq) = v { for (i, v) in seq.iter().enumerate() { self.add_rule_for_action(action, v) .context(format!("invalid value for {k}#{i}"))?; @@ -45,7 +45,7 @@ trait InspectRuleYamlParser { } fn as_protocol_inspect_action(value: &Yaml) -> anyhow::Result { - if let Yaml::String(s) = value { + if let Yaml::Value(Scalar::String(s)) = value { ProtocolInspectAction::from_str(s) .map_err(|_| anyhow!("invalid protocol inspect action '{s}'")) } else { @@ -57,7 +57,7 @@ pub fn as_protocol_inspect_policy_builder( value: &Yaml, ) -> anyhow::Result { match value { - Yaml::Hash(map) => { + Yaml::Mapping(map) => { let mut builder = ProtocolInspectPolicyBuilder::default(); crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { "default" => { diff --git a/lib/vey-yaml/src/value/dpi/policy/network.rs b/lib/vey-yaml/src/value/dpi/policy/network.rs index 927ef6181..7db70ef8a 100644 --- a/lib/vey-yaml/src/value/dpi/policy/network.rs +++ b/lib/vey-yaml/src/value/dpi/policy/network.rs @@ -3,7 +3,7 @@ * SPDX-FileCopyrightText: 2024-2025 ByteDance and/or its affiliates. */ -use yaml_rust::Yaml; +use saphyr::Yaml; use vey_dpi::ProtocolInspectAction; use vey_types::acl::AclNetworkRuleBuilder; @@ -34,6 +34,7 @@ pub(super) fn as_dst_subnet_rule_builder( #[cfg(feature = "dpi")] mod tests { use super::*; + use saphyr::Scalar; use std::net::{IpAddr, Ipv4Addr, Ipv6Addr}; #[test] @@ -67,7 +68,7 @@ mod tests { ); // Non-string YAML input - let yaml = Yaml::Integer(42); + let yaml = Yaml::Value(Scalar::Integer(42)); assert!( rule.add_rule_for_action(ProtocolInspectAction::Block, &yaml) .is_err() @@ -129,7 +130,7 @@ mod tests { assert!(as_dst_subnet_rule_builder(&yaml).is_err()); // Non-string input - let yaml = Yaml::Null; + let yaml = Yaml::Value(Scalar::Null); assert!(as_dst_subnet_rule_builder(&yaml).is_err()); } } diff --git a/lib/vey-yaml/src/value/dpi/policy/suffix_domain.rs b/lib/vey-yaml/src/value/dpi/policy/suffix_domain.rs index 65f523d48..c64b2bf6f 100644 --- a/lib/vey-yaml/src/value/dpi/policy/suffix_domain.rs +++ b/lib/vey-yaml/src/value/dpi/policy/suffix_domain.rs @@ -5,7 +5,7 @@ */ use anyhow::anyhow; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_dpi::ProtocolInspectAction; use vey_types::acl::AclSuffixDomainRuleBuilder; @@ -19,7 +19,7 @@ impl InspectRuleYamlParser for AclSuffixDomainRuleBuilder value: &Yaml, ) -> anyhow::Result<()> { match value { - Yaml::String(_) => { + Yaml::Value(Scalar::String(_)) => { let host = crate::value::as_domain(value)?; self.add_node(&host, action); Ok(()) @@ -41,6 +41,7 @@ pub(super) fn as_suffix_domain_rule_builder( #[cfg(feature = "dpi")] mod tests { use super::*; + use vey_types::literal_domain; #[test] @@ -68,7 +69,7 @@ mod tests { // non-string YAML type let mut builder = AclSuffixDomainRuleBuilder::new(ProtocolInspectAction::Intercept); - let yaml = Yaml::Boolean(true); + let yaml = Yaml::Value(Scalar::Boolean(true)); assert!( builder .add_rule_for_action(ProtocolInspectAction::Block, &yaml) @@ -108,7 +109,7 @@ mod tests { ); assert!(as_suffix_domain_rule_builder(&yaml).is_err()); - let yaml = Yaml::Integer(42); + let yaml = Yaml::Value(Scalar::Integer(42)); assert!(as_suffix_domain_rule_builder(&yaml).is_err()); } } diff --git a/lib/vey-yaml/src/value/dpi/portmap.rs b/lib/vey-yaml/src/value/dpi/portmap.rs index 0ad11ce2b..19f125ce3 100644 --- a/lib/vey-yaml/src/value/dpi/portmap.rs +++ b/lib/vey-yaml/src/value/dpi/portmap.rs @@ -7,12 +7,12 @@ use std::str::FromStr; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::{Scalar, Yaml}; use vey_dpi::{MaybeProtocol, ProtocolPortMap}; pub fn as_maybe_protocol(value: &Yaml) -> anyhow::Result { - if let Yaml::String(s) = value { + if let Yaml::Value(Scalar::String(s)) = value { MaybeProtocol::from_str(s).map_err(|_| anyhow!("unrecognised protocol {s}")) } else { Err(anyhow!( @@ -25,11 +25,11 @@ fn as_maybe_protocol_list(value: &Yaml) -> anyhow::Result> { let mut r = Vec::new(); match value { - Yaml::String(s) => { + Yaml::Value(Scalar::String(s)) => { let p = MaybeProtocol::from_str(s).map_err(|_| anyhow!("unrecognised protocol {s}"))?; r.push(p); } - Yaml::Array(seq) => { + Yaml::Sequence(seq) => { for (i, v) in seq.iter().enumerate() { let p = as_maybe_protocol(v) .context(format!("invalid maybe protocol value for #{i}"))?; @@ -42,7 +42,7 @@ fn as_maybe_protocol_list(value: &Yaml) -> anyhow::Result> { Ok(r) } -fn update_by_map_value(portmap: &mut ProtocolPortMap, map: &yaml::Hash) -> anyhow::Result<()> { +fn update_by_map_value(portmap: &mut ProtocolPortMap, map: &saphyr::Mapping) -> anyhow::Result<()> { for (port, protocol) in map.iter() { let port = crate::value::as_u16(port) .context("the root map key should be valid u16 port value")?; @@ -54,9 +54,12 @@ fn update_by_map_value(portmap: &mut ProtocolPortMap, map: &yaml::Hash) -> anyho Ok(()) } -fn update_by_seq_value(portmap: &mut ProtocolPortMap, seq: &yaml::Array) -> anyhow::Result<()> { +fn update_by_seq_value( + portmap: &mut ProtocolPortMap, + seq: &saphyr::Sequence, +) -> anyhow::Result<()> { for (i, v) in seq.iter().enumerate() { - if let Yaml::Hash(map) = v { + if let Yaml::Mapping(map) = v { let port = crate::hash_get_required(map, "port")?; let port = crate::value::as_u16(port).context("invalid u16 port value for key 'port'")?; @@ -74,9 +77,9 @@ fn update_by_seq_value(portmap: &mut ProtocolPortMap, seq: &yaml::Array) -> anyh pub fn update_protocol_portmap(portmap: &mut ProtocolPortMap, value: &Yaml) -> anyhow::Result<()> { match value { - Yaml::Hash(map) => update_by_map_value(portmap, map) + Yaml::Mapping(map) => update_by_map_value(portmap, map) .context("invalid yaml map value for 'protocol portmap'"), - Yaml::Array(seq) => update_by_seq_value(portmap, seq) + Yaml::Sequence(seq) => update_by_seq_value(portmap, seq) .context("invalid yaml seq value for 'protocol portmap'"), _ => Err(anyhow!("invalid yaml value type for 'protocol portmap'")), } diff --git a/lib/vey-yaml/src/value/dpi/smtp.rs b/lib/vey-yaml/src/value/dpi/smtp.rs index 0bd781187..58a9a883b 100644 --- a/lib/vey-yaml/src/value/dpi/smtp.rs +++ b/lib/vey-yaml/src/value/dpi/smtp.rs @@ -4,12 +4,12 @@ */ use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::Yaml; use vey_dpi::SmtpInterceptionConfig; pub fn as_smtp_interception_config(value: &Yaml) -> anyhow::Result { - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { let mut config = SmtpInterceptionConfig::default(); crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { @@ -70,6 +70,7 @@ pub fn as_smtp_interception_config(value: &Yaml) -> anyhow::Result anyhow::Result { - if let Yaml::String(path) = v { + if let Yaml::Value(Scalar::String(path)) = v { let path = PathBuf::from_str(path).map_err(|e| anyhow!("invalid path: {e:?}"))?; let path = if path.is_absolute() { path @@ -58,7 +58,7 @@ pub fn as_file(v: &Yaml, lookup_dir: Option<&Path>) -> anyhow::Result<(File, Pat } pub fn as_absolute_path(v: &Yaml) -> anyhow::Result { - if let Yaml::String(path) = v { + if let Yaml::Value(Scalar::String(path)) = v { let path = PathBuf::from_str(path).map_err(|e| anyhow!("invalid path: {e:?}"))?; if path.is_relative() { return Err(anyhow!( @@ -75,7 +75,7 @@ pub fn as_absolute_path(v: &Yaml) -> anyhow::Result { } pub fn as_config_file_format(v: &Yaml) -> anyhow::Result { - if let Yaml::String(s) = v { + if let Yaml::Value(Scalar::String(s)) = v { Ok(ConfigFileFormat::from_str(s) .map_err(|_| anyhow!("invalid config file format string"))?) } else { @@ -86,7 +86,7 @@ pub fn as_config_file_format(v: &Yaml) -> anyhow::Result { } pub fn as_dir_path(v: &Yaml, lookup_dir: &Path, auto_create: bool) -> anyhow::Result { - if let Yaml::String(path) = v { + if let Yaml::Value(Scalar::String(path)) = v { let path = PathBuf::from_str(path).map_err(|e| anyhow!("invalid path: {e:?}"))?; let path = if path.is_absolute() { path @@ -115,6 +115,7 @@ pub fn as_dir_path(v: &Yaml, lookup_dir: &Path, auto_create: bool) -> anyhow::Re #[cfg(test)] mod tests { use super::*; + use std::fs; use std::io::Write; use std::sync::atomic::{AtomicUsize, Ordering}; @@ -152,7 +153,7 @@ mod tests { fs::File::create(&file_path).unwrap(); // existing absolute path - let yaml = Yaml::String(file_path.to_str().unwrap().to_string()); + let yaml = yaml_str!(file_path.to_str().unwrap()); assert_eq!( as_file_path(&yaml, temp_dir.path(), false).unwrap(), file_path.canonicalize().unwrap() @@ -167,7 +168,7 @@ mod tests { // non-existing path with auto_create true let new_file_path = temp_dir.path().join("new.txt"); - let yaml = Yaml::String(new_file_path.to_str().unwrap().to_string()); + let yaml = yaml_str!(new_file_path.to_str().unwrap()); assert_eq!( as_file_path(&yaml, temp_dir.path(), true).unwrap(), new_file_path.canonicalize().unwrap() @@ -180,23 +181,23 @@ mod tests { let temp_dir = TempDir::new("as_file_path_err"); // non-string YAML - let yaml = Yaml::Integer(123); + let yaml = Yaml::Value(Scalar::Integer(123)); assert!(as_file_path(&yaml, temp_dir.path(), false).is_err()); // existing path that is not a file let sub_dir = temp_dir.path().join("subdir"); fs::create_dir(&sub_dir).unwrap(); - let yaml = Yaml::String(sub_dir.to_str().unwrap().to_string()); + let yaml = yaml_str!(sub_dir.to_str().unwrap()); assert!(as_file_path(&yaml, temp_dir.path(), false).is_err()); // non-existing path with auto_create false let non_existing_path = temp_dir.path().join("non_existing.txt"); - let yaml = Yaml::String(non_existing_path.to_str().unwrap().to_string()); + let yaml = yaml_str!(non_existing_path.to_str().unwrap()); assert!(as_file_path(&yaml, temp_dir.path(), false).is_err()); // invalid path creation let invalid_path = temp_dir.path().join("invalid\u{e000}dir\u{0000}test.txt"); - let yaml = Yaml::String(invalid_path.to_str().unwrap().to_string()); + let yaml = yaml_str!(invalid_path.to_str().unwrap()); assert!(as_file_path(&yaml, temp_dir.path(), true).is_err()); } @@ -208,7 +209,7 @@ mod tests { file.write_all(b"test").unwrap(); // absolute path without lookup_dir - let yaml = Yaml::String(file_path.to_str().unwrap().to_string()); + let yaml = yaml_str!(file_path.to_str().unwrap()); let (opened_file, path) = as_file(&yaml, None).unwrap(); assert_eq!( path.canonicalize().unwrap(), @@ -231,12 +232,12 @@ mod tests { let temp_dir = TempDir::new("as_file_err"); // non-string YAML - let yaml = Yaml::Integer(123); + let yaml = Yaml::Value(Scalar::Integer(123)); assert!(as_file(&yaml, None).is_err()); // non-existing absolute path let non_existing_path = temp_dir.path().join("non_existing.txt"); - let yaml = Yaml::String(non_existing_path.to_str().unwrap().to_string()); + let yaml = yaml_str!(non_existing_path.to_str().unwrap()); assert!(as_file(&yaml, None).is_err()); } @@ -246,7 +247,7 @@ mod tests { let absolute_path = temp_dir.path().to_str().unwrap(); // valid absolute path - let yaml = Yaml::String(absolute_path.to_string()); + let yaml = yaml_str!(absolute_path); assert_eq!( as_absolute_path(&yaml).unwrap(), PathBuf::from(absolute_path) @@ -256,7 +257,7 @@ mod tests { #[test] fn as_absolute_path_err() { // non-string YAML - let yaml = Yaml::Integer(123); + let yaml = Yaml::Value(Scalar::Integer(123)); assert!(as_absolute_path(&yaml).is_err()); // relative path @@ -296,7 +297,7 @@ mod tests { #[test] fn as_config_file_format_err() { // non-string YAML - let yaml = Yaml::Integer(123); + let yaml = Yaml::Value(Scalar::Integer(123)); assert!(as_config_file_format(&yaml).is_err()); // invalid format string @@ -311,7 +312,7 @@ mod tests { fs::create_dir(&sub_dir).unwrap(); // existing absolute path - let yaml = Yaml::String(sub_dir.to_str().unwrap().to_string()); + let yaml = yaml_str!(sub_dir.to_str().unwrap()); assert_eq!( as_dir_path(&yaml, temp_dir.path(), false).unwrap(), sub_dir.canonicalize().unwrap() @@ -326,7 +327,7 @@ mod tests { // non-existing path with auto_create true let new_dir_path = temp_dir.path().join("newdir"); - let yaml = Yaml::String(new_dir_path.to_str().unwrap().to_string()); + let yaml = yaml_str!(new_dir_path.to_str().unwrap()); assert_eq!( as_dir_path(&yaml, temp_dir.path(), true).unwrap(), new_dir_path.canonicalize().unwrap() @@ -339,23 +340,23 @@ mod tests { let temp_dir = TempDir::new("as_dir_path_err"); // non-string YAML - let yaml = Yaml::Integer(123); + let yaml = Yaml::Value(Scalar::Integer(123)); assert!(as_dir_path(&yaml, temp_dir.path(), false).is_err()); // existing path that is not a directory let file_path = temp_dir.path().join("test.txt"); fs::File::create(&file_path).unwrap(); - let yaml = Yaml::String(file_path.to_str().unwrap().to_string()); + let yaml = yaml_str!(file_path.to_str().unwrap()); assert!(as_dir_path(&yaml, temp_dir.path(), false).is_err()); // non-existing path with auto_create false let non_existing_path = temp_dir.path().join("non_existing_dir"); - let yaml = Yaml::String(non_existing_path.to_str().unwrap().to_string()); + let yaml = yaml_str!(non_existing_path.to_str().unwrap()); assert!(as_dir_path(&yaml, temp_dir.path(), false).is_err()); // invalid path creation let invalid_path = temp_dir.path().join("invalid\u{e000}dir\u{0000}test.txt"); - let yaml = Yaml::String(invalid_path.to_str().unwrap().to_string()); + let yaml = yaml_str!(invalid_path.to_str().unwrap()); assert!(as_dir_path(&yaml, temp_dir.path(), true).is_err()); } } diff --git a/lib/vey-yaml/src/value/geoip.rs b/lib/vey-yaml/src/value/geoip.rs index 8c5c21e51..369cc9f8a 100644 --- a/lib/vey-yaml/src/value/geoip.rs +++ b/lib/vey-yaml/src/value/geoip.rs @@ -6,12 +6,12 @@ use std::str::FromStr; use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_geoip_types::{ContinentCode, IpLocation, IpLocationBuilder, IsoCountryCode}; pub fn as_iso_country_code(value: &Yaml) -> anyhow::Result { - if let Yaml::String(s) = value { + if let Yaml::Value(Scalar::String(s)) = value { let country = IsoCountryCode::from_str(s).map_err(|_| anyhow!("invalid iso country code"))?; Ok(country) @@ -23,7 +23,7 @@ pub fn as_iso_country_code(value: &Yaml) -> anyhow::Result { } pub fn as_continent_code(value: &Yaml) -> anyhow::Result { - if let Yaml::String(s) = value { + if let Yaml::Value(Scalar::String(s)) = value { let country = ContinentCode::from_str(s).map_err(|_| anyhow!("invalid continent code"))?; Ok(country) } else { @@ -34,7 +34,7 @@ pub fn as_continent_code(value: &Yaml) -> anyhow::Result { } pub fn as_ip_location(value: &Yaml) -> anyhow::Result { - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { let mut builder = IpLocationBuilder::default(); crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { @@ -110,9 +110,9 @@ mod tests { assert!(as_iso_country_code(&yaml_str!("INVALID")).is_err()); // non-string types - assert!(as_iso_country_code(&Yaml::Integer(123)).is_err()); - assert!(as_iso_country_code(&Yaml::Boolean(true)).is_err()); - assert!(as_iso_country_code(&Yaml::Null).is_err()); + assert!(as_iso_country_code(&Yaml::Value(Scalar::Integer(123))).is_err()); + assert!(as_iso_country_code(&Yaml::Value(Scalar::Boolean(true))).is_err()); + assert!(as_iso_country_code(&Yaml::Value(Scalar::Null)).is_err()); } #[test] @@ -138,9 +138,9 @@ mod tests { assert!(as_continent_code(&yaml_str!("INVALID")).is_err()); // non-string types - assert!(as_continent_code(&Yaml::Integer(123)).is_err()); - assert!(as_continent_code(&Yaml::Boolean(false)).is_err()); - assert!(as_continent_code(&Yaml::Null).is_err()); + assert!(as_continent_code(&Yaml::Value(Scalar::Integer(123))).is_err()); + assert!(as_continent_code(&Yaml::Value(Scalar::Boolean(false))).is_err()); + assert!(as_continent_code(&Yaml::Value(Scalar::Null)).is_err()); } #[test] diff --git a/lib/vey-yaml/src/value/histogram.rs b/lib/vey-yaml/src/value/histogram.rs index 4d4481ba0..bc87f31cd 100644 --- a/lib/vey-yaml/src/value/histogram.rs +++ b/lib/vey-yaml/src/value/histogram.rs @@ -7,16 +7,18 @@ use std::collections::BTreeSet; use std::str::FromStr; use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_histogram::{HistogramMetricsConfig, Quantile}; pub fn as_quantile(value: &Yaml) -> anyhow::Result { match value { - Yaml::String(s) => { + Yaml::Value(Scalar::String(s)) => { Quantile::from_str(s).map_err(|e| anyhow!("invalid quantile value: {e}")) } - Yaml::Real(s) => Quantile::from_str(s).map_err(|e| anyhow!("invalid quantile value: {e}")), + Yaml::Value(Scalar::FloatingPoint(n)) => { + Quantile::from_str(&n.to_string()).map_err(|e| anyhow!("invalid quantile value: {e}")) + } _ => Err(anyhow!( "yaml value type for 'quantile' should be 'str' or 'float'" )), @@ -26,14 +28,14 @@ pub fn as_quantile(value: &Yaml) -> anyhow::Result { pub fn as_quantile_list(value: &Yaml) -> anyhow::Result> { let mut set = BTreeSet::new(); match value { - Yaml::String(s) => { + Yaml::Value(Scalar::String(s)) => { for v in s.split(',') { let f = Quantile::from_str(v.trim()) .map_err(|e| anyhow!("invalid quantile string {v}: {e}"))?; set.insert(f); } } - Yaml::Array(seq) => { + Yaml::Sequence(seq) => { for (i, v) in seq.iter().enumerate() { let f = as_quantile(v).context(format!("invalid quantile value for element #{i}"))?; @@ -50,7 +52,7 @@ pub fn as_quantile_list(value: &Yaml) -> anyhow::Result> { } pub fn as_histogram_metrics_config(value: &Yaml) -> anyhow::Result { - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { let mut config = HistogramMetricsConfig::default(); crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { "quantile" => { @@ -79,6 +81,7 @@ pub fn as_histogram_metrics_config(value: &Yaml) -> anyhow::Result anyhow::Result { - if let Yaml::String(s) = v { + if let Yaml::Value(Scalar::String(s)) = v { let name = NodeName::from_str(s).map_err(|e| anyhow!("invalid metric node name: {e}"))?; Ok(name) } else { @@ -24,7 +24,7 @@ pub fn as_metric_node_name(v: &Yaml) -> anyhow::Result { } pub fn as_metric_tag_name(v: &Yaml) -> anyhow::Result { - if let Yaml::String(s) = v { + if let Yaml::Value(Scalar::String(s)) = v { let name = MetricTagName::from_str(s).map_err(|e| anyhow!("invalid metric tag name: {e}"))?; Ok(name) @@ -41,7 +41,7 @@ pub fn as_metric_tag_value(v: &Yaml) -> anyhow::Result { } pub fn as_static_metrics_tags(v: &Yaml) -> anyhow::Result { - if let Yaml::Hash(map) = v { + if let Yaml::Mapping(map) = v { let mut tags = MetricTagMap::default(); crate::foreach_kv(map, |k, v| { let name = MetricTagName::from_str(k).context("invalid metrics tag name")?; @@ -62,7 +62,7 @@ pub fn as_static_metrics_tags(v: &Yaml) -> anyhow::Result { } pub fn as_weighted_metric_node_name(value: &Yaml) -> anyhow::Result> { - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { let mut name = NodeName::default(); let mut weight = None; @@ -120,7 +120,7 @@ mod tests { assert!(as_metric_node_name(&yaml).is_err()); // Non-string type - let yaml = Yaml::Integer(123); + let yaml = Yaml::Value(Scalar::Integer(123)); assert!(as_metric_node_name(&yaml).is_err()); } @@ -144,7 +144,7 @@ mod tests { assert!(as_metric_tag_name(&yaml).is_err()); // Non-string type - let yaml = Yaml::Boolean(true); + let yaml = Yaml::Value(Scalar::Boolean(true)); assert!(as_metric_tag_name(&yaml).is_err()); } @@ -168,7 +168,7 @@ mod tests { assert!(as_metric_tag_value(&yaml).is_err()); // Non-string type - let yaml = Yaml::Array(vec![]); + let yaml = Yaml::Sequence(vec![]); assert!(as_metric_tag_value(&yaml).is_err()); } diff --git a/lib/vey-yaml/src/value/net/base.rs b/lib/vey-yaml/src/value/net/base.rs index fc0b86d2e..0706bd033 100644 --- a/lib/vey-yaml/src/value/net/base.rs +++ b/lib/vey-yaml/src/value/net/base.rs @@ -8,17 +8,16 @@ use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr, ToSocketAddrs}; use std::str::FromStr; use anyhow::{Context, anyhow}; -use url::Url; -use yaml_rust::Yaml; - #[cfg(feature = "acl-rule")] use ip_network::IpNetwork; +use saphyr::{Scalar, Yaml}; +use url::Url; use vey_types::collection::WeightedValue; use vey_types::net::{CongestionAlgorithm, DomainName, Host, UpstreamAddr, WeightedUpstreamAddr}; pub fn as_env_sockaddr(value: &Yaml) -> anyhow::Result { - if let Yaml::String(s) = value { + if let Yaml::Value(Scalar::String(s)) = value { if let Some(var) = s.strip_prefix('$') { let s = std::env::var(var) .map_err(|e| anyhow!("failed to get environment var {var}: {e}"))?; @@ -48,7 +47,7 @@ pub fn as_env_sockaddr(value: &Yaml) -> anyhow::Result { } pub fn as_sockaddr(value: &Yaml) -> anyhow::Result { - if let Yaml::String(s) = value { + if let Yaml::Value(Scalar::String(s)) = value { let addr = SocketAddr::from_str(s).map_err(|e| anyhow!("invalid socket address: {e}"))?; if addr.port() == 0 { return Err(anyhow!("socket address port should be non-zero")); @@ -66,7 +65,7 @@ pub fn as_weighted_sockaddr(value: &Yaml) -> anyhow::Result { + Yaml::Mapping(map) => { let v = crate::hash::get_required(map, KEY_ADDR)?; let addr = as_sockaddr(v) .context(format!("invalid sockaddr string value for key {KEY_ADDR}"))?; @@ -90,7 +89,7 @@ pub fn as_weighted_sockaddr(value: &Yaml) -> anyhow::Result anyhow::Result { - if let Yaml::String(s) = value { + if let Yaml::Value(Scalar::String(s)) = value { let ip = IpAddr::from_str(s).map_err(|e| anyhow!("invalid ip address: {e}"))?; Ok(ip) } else { @@ -99,7 +98,7 @@ pub fn as_ipaddr(value: &Yaml) -> anyhow::Result { } pub fn as_ipv4addr(value: &Yaml) -> anyhow::Result { - if let Yaml::String(s) = value { + if let Yaml::Value(Scalar::String(s)) = value { let ip4 = Ipv4Addr::from_str(s).map_err(|e| anyhow!("invalid ipv4 address: {e}"))?; Ok(ip4) } else { @@ -108,7 +107,7 @@ pub fn as_ipv4addr(value: &Yaml) -> anyhow::Result { } pub fn as_ipv6addr(value: &Yaml) -> anyhow::Result { - if let Yaml::String(s) = value { + if let Yaml::Value(Scalar::String(s)) = value { let ip6 = Ipv6Addr::from_str(s).map_err(|e| anyhow!("invalid ipv6 address: {e}"))?; Ok(ip6) } else { @@ -118,7 +117,7 @@ pub fn as_ipv6addr(value: &Yaml) -> anyhow::Result { #[cfg(feature = "acl-rule")] pub fn as_ip_network(value: &Yaml) -> anyhow::Result { - if let Yaml::String(s) = value { + if let Yaml::Value(Scalar::String(s)) = value { let net = match IpNetwork::from_str(s) { Ok(net) => net, Err(_) => match IpAddr::from_str(s) { @@ -140,7 +139,7 @@ pub fn as_ip_network(value: &Yaml) -> anyhow::Result { } pub fn as_host(value: &Yaml) -> anyhow::Result { - if let Yaml::String(s) = value { + if let Yaml::Value(Scalar::String(s)) = value { if let Ok(ip) = IpAddr::from_str(s) { Ok(Host::Ip(ip)) } else { @@ -152,7 +151,7 @@ pub fn as_host(value: &Yaml) -> anyhow::Result { } pub fn as_domain(value: &Yaml) -> anyhow::Result { - if let Yaml::String(s) = value { + if let Yaml::Value(Scalar::String(s)) = value { DomainName::from_str(s).map_err(|e| anyhow!("invalid domain name {s}: {e}")) } else { Err(anyhow!("yaml value type for 'Domain' should be 'string'")) @@ -160,7 +159,7 @@ pub fn as_domain(value: &Yaml) -> anyhow::Result { } pub fn as_url(value: &Yaml) -> anyhow::Result { - if let Yaml::String(s) = value { + if let Yaml::Value(Scalar::String(s)) = value { let url = Url::from_str(s).map_err(|e| anyhow!("invalid url: {e}"))?; Ok(url) } else { @@ -169,7 +168,7 @@ pub fn as_url(value: &Yaml) -> anyhow::Result { } pub fn as_upstream_addr(value: &Yaml, default_port: u16) -> anyhow::Result { - if let Yaml::String(s) = value { + if let Yaml::Value(Scalar::String(s)) = value { let mut addr = UpstreamAddr::from_str(s).context("invalid upstream addr string")?; if addr.port() == 0 { if default_port == 0 { @@ -191,12 +190,12 @@ pub fn as_weighted_upstream_addr( default_port: u16, ) -> anyhow::Result { match value { - Yaml::String(_) => { + Yaml::Value(Scalar::String(_)) => { let addr = as_upstream_addr(value, default_port).context("invalid upstream addr string")?; Ok(WeightedUpstreamAddr::new(addr)) } - Yaml::Hash(map) => { + Yaml::Mapping(map) => { let mut addr = UpstreamAddr::empty(); let mut weight = WeightedUpstreamAddr::DEFAULT_WEIGHT; crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { @@ -223,7 +222,7 @@ pub fn as_weighted_upstream_addr( } pub fn as_congestion_algorithm(value: &Yaml) -> anyhow::Result { - if let Yaml::String(s) = value { + if let Yaml::Value(Scalar::String(s)) = value { let ca = CongestionAlgorithm::from_str(s) .map_err(|e| anyhow!("invalid congestion algorithm: {e}"))?; Ok(ca) @@ -237,6 +236,7 @@ pub fn as_congestion_algorithm(value: &Yaml) -> anyhow::Result anyhow::Result { + Yaml::Value(_) => { let size = crate::humanize::as_usize(value).context("invalid single humanize usize value")?; config.set_recv_size(size); config.set_send_size(size); } - Yaml::Hash(map) => { + Yaml::Mapping(map) => { crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { "recv" | "receive" | "read" => { let size = crate::humanize::as_usize(v) @@ -44,11 +44,11 @@ pub fn as_socket_buffer_config(value: &Yaml) -> anyhow::Result anyhow::Result { - if let Yaml::String(s) = value { + if let Yaml::Value(Scalar::String(s)) = value { DnsEncryptionProtocol::from_str(s).context("invalid dns encryption protocol value") } else { Err(anyhow!( @@ -29,7 +29,7 @@ pub fn as_dns_encryption_protocol_builder( const KEY_TLS_NAME: &str = "tls_name"; match value { - Yaml::Hash(map) => { + Yaml::Mapping(map) => { let name_v = crate::hash_get_required(map, KEY_TLS_NAME)?; let name = crate::value::as_rustls_server_name(name_v).context(format!( "invalid tls server name value for key {KEY_TLS_NAME}", @@ -55,7 +55,7 @@ pub fn as_dns_encryption_protocol_builder( Ok(config) } - Yaml::String(_) => { + Yaml::Value(Scalar::String(_)) => { let name = crate::value::as_rustls_server_name(value) .context("the string type value should be valid tls server name")?; Ok(DnsEncryptionConfigBuilder::new(name)) @@ -67,6 +67,7 @@ pub fn as_dns_encryption_protocol_builder( #[cfg(test)] mod tests { use super::*; + use std::fs; use std::path::PathBuf; use std::sync::atomic::{AtomicUsize, Ordering}; @@ -143,7 +144,7 @@ mod tests { let yaml = yaml_str!("invalid"); assert!(as_dns_encryption_protocol(&yaml).is_err()); - let yaml = Yaml::Boolean(true); + let yaml = Yaml::Value(Scalar::Boolean(true)); assert!(as_dns_encryption_protocol(&yaml).is_err()); let yaml = yaml_doc!( @@ -169,10 +170,10 @@ mod tests { ); assert!(as_dns_encryption_protocol_builder(&yaml, None).is_err()); - let yaml = Yaml::Boolean(false); + let yaml = Yaml::Value(Scalar::Boolean(false)); assert!(as_dns_encryption_protocol_builder(&yaml, None).is_err()); - let yaml = Yaml::Integer(42); + let yaml = Yaml::Value(Scalar::Integer(42)); assert!(as_dns_encryption_protocol_builder(&yaml, None).is_err()); // Invalid string values @@ -183,7 +184,7 @@ mod tests { assert!(as_dns_encryption_protocol_builder(&yaml, None).is_err()); // Invalid value type - let yaml = Yaml::Null; + let yaml = Yaml::Value(Scalar::Null); assert!(as_dns_encryption_protocol_builder(&yaml, None).is_err()); let temp_dir = TempDir::new("vey_yaml_err"); diff --git a/lib/vey-yaml/src/value/net/haproxy.rs b/lib/vey-yaml/src/value/net/haproxy.rs index ffe1f6dbe..e54d9794f 100644 --- a/lib/vey-yaml/src/value/net/haproxy.rs +++ b/lib/vey-yaml/src/value/net/haproxy.rs @@ -3,9 +3,9 @@ * SPDX-FileCopyrightText: 2023-2025 ByteDance and/or its affiliates. */ -use yaml_rust::Yaml; - use anyhow::{Context, anyhow}; +use saphyr::Yaml; + use vey_types::net::ProxyProtocolVersion; pub fn as_proxy_protocol_version(value: &Yaml) -> anyhow::Result { @@ -21,6 +21,7 @@ pub fn as_proxy_protocol_version(value: &Yaml) -> anyhow::Result anyhow::Result let mut config = HttpKeepAliveConfig::default(); match v { - Yaml::Hash(map) => { + Yaml::Mapping(map) => { crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { "enable" => { let enable = crate::value::as_bool(v)?; @@ -34,7 +34,7 @@ pub fn as_http_keepalive_config(v: &Yaml) -> anyhow::Result _ => Err(anyhow!("invalid key {k}")), })?; } - Yaml::Boolean(enable) => { + Yaml::Value(Scalar::Boolean(enable)) => { config.set_enable(*enable); } _ => { @@ -53,7 +53,7 @@ pub fn as_http_forwarded_header_type(value: &Yaml) -> anyhow::Result Ok(HttpForwardedHeaderType::default()), Ok(false) => Ok(HttpForwardedHeaderType::Disable), Err(_) => { - if let Yaml::String(s) = value { + if let Yaml::Value(Scalar::String(s)) = value { HttpForwardedHeaderType::from_str(s) .map_err(|_| anyhow!("invalid string value for 'HttpForwardedHeaderType'")) } else { @@ -69,7 +69,7 @@ pub fn as_http_forward_capability(value: &Yaml) -> anyhow::Result { + Yaml::Mapping(map) => { let mut forward_ftp = None; let mut forward_ftp_get = None; let mut forward_ftp_put = None; @@ -126,7 +126,7 @@ pub fn as_http_forward_capability(value: &Yaml) -> anyhow::Result anyhow::Result { - if let Yaml::String(s) = value { + if let Yaml::Value(Scalar::String(s)) = value { let id = HttpServerId::from_str(s)?; Ok(id) } else { @@ -137,7 +137,7 @@ pub fn as_http_server_id(value: &Yaml) -> anyhow::Result { } pub fn as_http_header_name(value: &Yaml) -> anyhow::Result { - if let Yaml::String(s) = value { + if let Yaml::Value(Scalar::String(s)) = value { HeaderName::from_str(s).map_err(|e| anyhow!(e)) } else { Err(anyhow!( @@ -153,7 +153,7 @@ pub fn as_http_header_value_string(value: &Yaml) -> anyhow::Result { } pub fn as_http_path_and_query(value: &Yaml) -> anyhow::Result { - if let Yaml::String(s) = value { + if let Yaml::Value(Scalar::String(s)) = value { PathAndQuery::from_str(s).map_err(|e| anyhow!(e)) } else { Err(anyhow!( @@ -166,7 +166,9 @@ pub fn as_http_path_and_query(value: &Yaml) -> anyhow::Result { #[cfg(feature = "http")] mod tests { use super::*; + use http::Method; + use std::time::Duration; #[test] @@ -203,7 +205,7 @@ mod tests { assert_eq!(config.idle_expire(), Duration::from_secs(30)); // Valid config with boolean value - let yaml = Yaml::Boolean(true); + let yaml = Yaml::Value(Scalar::Boolean(true)); let config = as_http_keepalive_config(&yaml).unwrap(); assert!(config.is_enabled()); @@ -214,7 +216,7 @@ mod tests { assert_eq!(config.idle_expire(), Duration::from_secs(30)); // Valid config with integer value - let yaml = Yaml::Integer(60); + let yaml = Yaml::Value(Scalar::Integer(60)); let config = as_http_keepalive_config(&yaml).unwrap(); assert!(config.is_enabled()); assert_eq!(config.idle_expire(), Duration::from_secs(60)); @@ -247,18 +249,18 @@ mod tests { assert!(as_http_keepalive_config(&yaml).is_err()); // Invalid config with unsupported type - let yaml = Yaml::Real("not_a_duration".to_string()); + let yaml = yaml_str!("not_a_duration"); assert!(as_http_keepalive_config(&yaml).is_err()); } #[test] fn as_http_forwarded_header_type_ok() { // Valid config with boolean value - let yaml = Yaml::Boolean(true); + let yaml = Yaml::Value(Scalar::Boolean(true)); let header_type = as_http_forwarded_header_type(&yaml).unwrap(); assert_eq!(header_type, HttpForwardedHeaderType::default()); - let yaml = Yaml::Boolean(false); + let yaml = Yaml::Value(Scalar::Boolean(false)); let header_type = as_http_forwarded_header_type(&yaml).unwrap(); assert_eq!(header_type, HttpForwardedHeaderType::Disable); @@ -268,11 +270,11 @@ mod tests { assert_eq!(header_type, HttpForwardedHeaderType::Standard); // Valid config with integer value - let yaml = Yaml::Integer(1); + let yaml = Yaml::Value(Scalar::Integer(1)); let header_type = as_http_forwarded_header_type(&yaml).unwrap(); assert_eq!(header_type, HttpForwardedHeaderType::default()); - let yaml = Yaml::Integer(0); + let yaml = Yaml::Value(Scalar::Integer(0)); let header_type = as_http_forwarded_header_type(&yaml).unwrap(); assert_eq!(header_type, HttpForwardedHeaderType::Disable); } @@ -280,7 +282,7 @@ mod tests { #[test] fn as_http_forwarded_header_type_err() { // Invalid config with unsupported type - let yaml = Yaml::Null; + let yaml = Yaml::Value(Scalar::Null); assert!(as_http_forwarded_header_type(&yaml).is_err()); // Invalid config with invalid string value @@ -372,7 +374,7 @@ mod tests { assert!(as_http_forward_capability(&yaml).is_err()); // Invalid config with unsupported type - let yaml = Yaml::Null; + let yaml = Yaml::Value(Scalar::Null); assert!(as_http_forward_capability(&yaml).is_err()); } @@ -387,7 +389,7 @@ mod tests { #[test] fn as_http_server_id_err() { // Invalid config with wrong value type - let yaml = Yaml::Integer(123); + let yaml = Yaml::Value(Scalar::Integer(123)); assert!(as_http_server_id(&yaml).is_err()); } @@ -406,7 +408,7 @@ mod tests { assert!(as_http_header_name(&yaml).is_err()); // Invalid type - let yaml = Yaml::Integer(123); + let yaml = Yaml::Value(Scalar::Integer(123)); assert!(as_http_header_name(&yaml).is_err()); } @@ -429,7 +431,7 @@ mod tests { assert!(as_http_header_value_string(&yaml).is_err()); // Invalid type - let yaml = Yaml::Null; + let yaml = Yaml::Value(Scalar::Null); assert!(as_http_header_value_string(&yaml).is_err()); } @@ -448,7 +450,7 @@ mod tests { assert!(as_http_path_and_query(&yaml).is_err()); // Invalid type - let yaml = Yaml::Integer(123); + let yaml = Yaml::Value(Scalar::Integer(123)); assert!(as_http_path_and_query(&yaml).is_err()); } } diff --git a/lib/vey-yaml/src/value/net/interface.rs b/lib/vey-yaml/src/value/net/interface.rs index d495dcb3e..aa573148f 100644 --- a/lib/vey-yaml/src/value/net/interface.rs +++ b/lib/vey-yaml/src/value/net/interface.rs @@ -8,14 +8,14 @@ use std::str::FromStr; use vey_types::net::Interface; use anyhow::anyhow; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; pub fn as_interface(value: &Yaml) -> anyhow::Result { match value { - Yaml::String(s) => { + Yaml::Value(Scalar::String(s)) => { Interface::from_str(s).map_err(|e| anyhow!("invalid interface name {s}: {e}")) } - Yaml::Integer(i) => { + Yaml::Value(Scalar::Integer(i)) => { let u = u32::try_from(*i).map_err(|_| anyhow!("out of range u32 value {}", *i))?; Interface::try_from(u).map_err(|e| anyhow!("invalid interface id {u}: {e}")) } @@ -37,10 +37,10 @@ mod tests { #[test] fn as_interface_ok() { - let yaml = Yaml::String(LOOPBACK_INTERFACE.to_string()); + let yaml = yaml_str!(LOOPBACK_INTERFACE); assert_eq!(as_interface(&yaml).unwrap().name(), LOOPBACK_INTERFACE); - let yaml = Yaml::Integer(1); + let yaml = Yaml::Value(Scalar::Integer(1)); let interface = as_interface(&yaml).unwrap(); assert_eq!(interface.id().get(), 1); } @@ -50,13 +50,13 @@ mod tests { let yaml = yaml_str!("invalid_interface"); assert!(as_interface(&yaml).is_err()); - let yaml = Yaml::Integer(u32::MAX as i64 + 1); + let yaml = Yaml::Value(Scalar::Integer(u32::MAX as i64 + 1)); assert!(as_interface(&yaml).is_err()); - let yaml = Yaml::Integer(0); + let yaml = Yaml::Value(Scalar::Integer(0)); assert!(as_interface(&yaml).is_err()); - let yaml = Yaml::Boolean(true); + let yaml = Yaml::Value(Scalar::Boolean(true)); assert!(as_interface(&yaml).is_err()); } } diff --git a/lib/vey-yaml/src/value/net/pool.rs b/lib/vey-yaml/src/value/net/pool.rs index c3c4a78e9..17f2978a6 100644 --- a/lib/vey-yaml/src/value/net/pool.rs +++ b/lib/vey-yaml/src/value/net/pool.rs @@ -5,7 +5,7 @@ */ use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::Yaml; use vey_types::net::ConnectionPoolConfig; @@ -13,7 +13,7 @@ pub fn update_connection_pool_config( config: &mut ConnectionPoolConfig, value: &Yaml, ) -> anyhow::Result<()> { - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { "check_interval" => { let interval = crate::humanize::as_duration(v) diff --git a/lib/vey-yaml/src/value/net/port.rs b/lib/vey-yaml/src/value/net/port.rs index db05b50df..6f44992f0 100644 --- a/lib/vey-yaml/src/value/net/port.rs +++ b/lib/vey-yaml/src/value/net/port.rs @@ -8,19 +8,19 @@ use std::num::NonZeroU16; use std::str::FromStr; use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_types::net::{PortRange, Ports}; fn as_single_ports(value: &Yaml) -> anyhow::Result { match value { - Yaml::Integer(i) => { + Yaml::Value(Scalar::Integer(i)) => { let port = u16::try_from(*i).map_err(|e| anyhow!("invalid u16 string: {e}"))?; let mut ports = Ports::default(); ports.add_single(port); Ok(ports) } - Yaml::String(s) => { + Yaml::Value(Scalar::String(s)) => { let ports = Ports::from_str(s)?; Ok(ports) } @@ -30,8 +30,8 @@ fn as_single_ports(value: &Yaml) -> anyhow::Result { pub fn as_ports(value: &Yaml) -> anyhow::Result { match value { - Yaml::Integer(_) | Yaml::String(_) => as_single_ports(value), - Yaml::Array(seq) => { + Yaml::Value(_) => as_single_ports(value), + Yaml::Sequence(seq) => { let mut ports = Ports::default(); for (i, v) in seq.iter().enumerate() { @@ -47,8 +47,8 @@ pub fn as_ports(value: &Yaml) -> anyhow::Result { pub fn as_port_range(value: &Yaml) -> anyhow::Result { match value { - Yaml::String(s) => PortRange::from_str(s), - Yaml::Hash(map) => { + Yaml::Value(Scalar::String(s)) => PortRange::from_str(s), + Yaml::Mapping(map) => { let mut start = 0; let mut end = 0; @@ -86,7 +86,7 @@ mod tests { #[test] fn as_single_ports_ok() { // Valid integer - let yaml = Yaml::Integer(8080); + let yaml = Yaml::Value(Scalar::Integer(8080)); let ports = as_single_ports(&yaml).unwrap(); assert!(ports.contains(8080)); assert!(!ports.contains(80)); @@ -114,7 +114,7 @@ mod tests { #[test] fn as_single_ports_err() { // Invalid integer (out of range) - let yaml = Yaml::Integer(65536); + let yaml = Yaml::Value(Scalar::Integer(65536)); assert!(as_single_ports(&yaml).is_err()); // Invalid string @@ -122,14 +122,14 @@ mod tests { assert!(as_single_ports(&yaml).is_err()); // Invalid type - let yaml = Yaml::Boolean(true); + let yaml = Yaml::Value(Scalar::Boolean(true)); assert!(as_single_ports(&yaml).is_err()); } #[test] fn as_ports_ok() { // Single integer - let yaml = Yaml::Integer(80); + let yaml = Yaml::Value(Scalar::Integer(80)); let ports = as_ports(&yaml).unwrap(); assert!(ports.contains(80)); @@ -139,8 +139,8 @@ mod tests { assert!(ports.contains(443)); // Array of integers and strings - let yaml = Yaml::Array(vec![ - Yaml::Integer(80), + let yaml = Yaml::Sequence(vec![ + Yaml::Value(Scalar::Integer(80)), yaml_str!("443"), yaml_str!("8000-8010"), ]); @@ -155,7 +155,7 @@ mod tests { #[test] fn as_ports_err() { // Empty array - let yaml = Yaml::Array(vec![]); + let yaml = Yaml::Sequence(vec![]); let ports = as_ports(&yaml).unwrap(); // Verify the ports collection is empty by checking a specific port assert!(!ports.contains(80)); @@ -163,11 +163,14 @@ mod tests { assert!(!ports.contains(8080)); // Array with invalid element - let yaml = Yaml::Array(vec![Yaml::Integer(80), Yaml::Boolean(true)]); + let yaml = Yaml::Sequence(vec![ + Yaml::Value(Scalar::Integer(80)), + Yaml::Value(Scalar::Boolean(true)), + ]); assert!(as_ports(&yaml).is_err()); // Invalid type - let yaml = Yaml::Null; + let yaml = Yaml::Value(Scalar::Null); assert!(as_ports(&yaml).is_err()); } @@ -180,19 +183,19 @@ mod tests { assert_eq!(range.end(), 8010); // Valid hash with start/end - let mut map = yaml_rust::yaml::Hash::new(); - map.insert(yaml_str!("start"), Yaml::Integer(9000)); - map.insert(yaml_str!("end"), Yaml::Integer(9010)); - let yaml = Yaml::Hash(map); + let mut map = saphyr::Mapping::new(); + map.insert(yaml_str!("start"), Yaml::Value(Scalar::Integer(9000))); + map.insert(yaml_str!("end"), Yaml::Value(Scalar::Integer(9010))); + let yaml = Yaml::Mapping(map); let range = as_port_range(&yaml).unwrap(); assert_eq!(range.start(), 9000); assert_eq!(range.end(), 9010); // Valid hash with from/to - let mut map = yaml_rust::yaml::Hash::new(); - map.insert(yaml_str!("from"), Yaml::Integer(10000)); - map.insert(yaml_str!("to"), Yaml::Integer(10010)); - let yaml = Yaml::Hash(map); + let mut map = saphyr::Mapping::new(); + map.insert(yaml_str!("from"), Yaml::Value(Scalar::Integer(10000))); + map.insert(yaml_str!("to"), Yaml::Value(Scalar::Integer(10010))); + let yaml = Yaml::Mapping(map); let range = as_port_range(&yaml).unwrap(); assert_eq!(range.start(), 10000); assert_eq!(range.end(), 10010); @@ -205,27 +208,27 @@ mod tests { assert!(as_port_range(&yaml).is_err()); // Hash missing required fields - let mut map = yaml_rust::yaml::Hash::new(); - map.insert(yaml_str!("start"), Yaml::Integer(11000)); - let yaml = Yaml::Hash(map); + let mut map = saphyr::Mapping::new(); + map.insert(yaml_str!("start"), Yaml::Value(Scalar::Integer(11000))); + let yaml = Yaml::Mapping(map); assert!(as_port_range(&yaml).is_err()); // Invalid port values - let mut map = yaml_rust::yaml::Hash::new(); + let mut map = saphyr::Mapping::new(); map.insert(yaml_str!("start"), yaml_str!("invalid")); - map.insert(yaml_str!("end"), Yaml::Integer(65536)); - let yaml = Yaml::Hash(map); + map.insert(yaml_str!("end"), Yaml::Value(Scalar::Integer(65536))); + let yaml = Yaml::Mapping(map); assert!(as_port_range(&yaml).is_err()); // Start > end - let mut map = yaml_rust::yaml::Hash::new(); - map.insert(yaml_str!("start"), Yaml::Integer(13000)); - map.insert(yaml_str!("end"), Yaml::Integer(12900)); - let yaml = Yaml::Hash(map); + let mut map = saphyr::Mapping::new(); + map.insert(yaml_str!("start"), Yaml::Value(Scalar::Integer(13000))); + map.insert(yaml_str!("end"), Yaml::Value(Scalar::Integer(12900))); + let yaml = Yaml::Mapping(map); assert!(as_port_range(&yaml).is_err()); // Invalid type - let yaml = Yaml::Integer(8080); + let yaml = Yaml::Value(Scalar::Integer(8080)); assert!(as_port_range(&yaml).is_err()); } } diff --git a/lib/vey-yaml/src/value/net/proxy.rs b/lib/vey-yaml/src/value/net/proxy.rs index 70e29071b..f45e6415f 100644 --- a/lib/vey-yaml/src/value/net/proxy.rs +++ b/lib/vey-yaml/src/value/net/proxy.rs @@ -6,12 +6,12 @@ use std::str::FromStr; use anyhow::anyhow; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_types::net::ProxyRequestType; pub fn as_proxy_request_type(v: &Yaml) -> anyhow::Result { - if let Yaml::String(s) = v { + if let Yaml::Value(Scalar::String(s)) = v { let t = ProxyRequestType::from_str(s) .map_err(|_| anyhow!("invalid ProxyRequestType string"))?; Ok(t) @@ -41,7 +41,7 @@ mod tests { assert!(as_proxy_request_type(&v).is_err()); // invalid yaml value type for 'ProxyRequestType' should be'string' - let v = Yaml::Integer(123); + let v = Yaml::Value(Scalar::Integer(123)); assert!(as_proxy_request_type(&v).is_err()); } } diff --git a/lib/vey-yaml/src/value/net/tcp.rs b/lib/vey-yaml/src/value/net/tcp.rs index 03e4078fd..4d4c4429d 100644 --- a/lib/vey-yaml/src/value/net/tcp.rs +++ b/lib/vey-yaml/src/value/net/tcp.rs @@ -7,7 +7,7 @@ use std::str::FromStr; use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_types::net::{ HappyEyeballsConfig, TcpConnectConfig, TcpKeepAliveConfig, TcpListenConfig, TcpMiscSockOpts, @@ -15,9 +15,9 @@ use vey_types::net::{ fn set_tcp_listen_scale(config: &mut TcpListenConfig, v: &Yaml) -> anyhow::Result<()> { match v { - Yaml::String(s) => { - if s.ends_with('%') { - let Ok(v) = f64::from_str(&s[..s.len() - 1]) else { + Yaml::Value(Scalar::String(s)) => { + if let Some(percent) = s.strip_suffix('%') { + let Ok(v) = f64::from_str(percent) else { return Err(anyhow!("invalid percentage value {s}")); }; config @@ -40,17 +40,12 @@ fn set_tcp_listen_scale(config: &mut TcpListenConfig, v: &Yaml) -> anyhow::Resul .context(format!("unsupported float value {s}")) } } - Yaml::Integer(i) => config + Yaml::Value(Scalar::Integer(i)) => config .set_scale(*i as f64) .context(format!("unsupported integer value {i}")), - Yaml::Real(s) => { - let Ok(v) = f64::from_str(s) else { - return Err(anyhow!("invalid float value: {s}")); - }; - config - .set_scale(v) - .context(format!("unsupported float value {s}")) - } + Yaml::Value(Scalar::FloatingPoint(n)) => config + .set_scale(**n) + .context(format!("unsupported float value {n}")), _ => Err(anyhow!( "yaml value type for tcp listen scale value should be 'str' or 'float'" )), @@ -61,16 +56,16 @@ pub fn as_tcp_listen_config(value: &Yaml) -> anyhow::Result { let mut config = TcpListenConfig::default(); match value { - Yaml::Integer(i) => { + Yaml::Value(Scalar::Integer(i)) => { let port = u16::try_from(*i).map_err(|e| anyhow!("out of range u16 value: {e}"))?; config.set_port(port); } - Yaml::String(_) => { + Yaml::Value(Scalar::String(_)) => { let addr = crate::value::as_env_sockaddr(value) .context("invalid tcp listen socket address value")?; config.set_socket_address(addr); } - Yaml::Hash(map) => { + Yaml::Mapping(map) => { crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { "addr" | "address" => { let addr = crate::value::as_env_sockaddr(v).context(format!( @@ -174,7 +169,7 @@ pub fn as_tcp_listen_config(value: &Yaml) -> anyhow::Result { } pub fn as_tcp_connect_config(v: &Yaml) -> anyhow::Result { - if let Yaml::Hash(map) = v { + if let Yaml::Mapping(map) = v { let mut config = TcpConnectConfig::default(); crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { @@ -200,7 +195,7 @@ pub fn as_tcp_connect_config(v: &Yaml) -> anyhow::Result { } pub fn as_happy_eyeballs_config(v: &Yaml) -> anyhow::Result { - if let Yaml::Hash(map) = v { + if let Yaml::Mapping(map) = v { let mut config = HappyEyeballsConfig::default(); crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { @@ -239,7 +234,7 @@ pub fn as_tcp_keepalive_config(v: &Yaml) -> anyhow::Result { let mut config = TcpKeepAliveConfig::default(); match v { - Yaml::Hash(map) => { + Yaml::Mapping(map) => { crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { "enable" => { let enable = crate::value::as_bool(v)?; @@ -264,7 +259,7 @@ pub fn as_tcp_keepalive_config(v: &Yaml) -> anyhow::Result { _ => Err(anyhow!("invalid key {k}")), })?; } - Yaml::Boolean(enable) => { + Yaml::Value(Scalar::Boolean(enable)) => { config.set_enable(*enable); } _ => { @@ -281,7 +276,7 @@ pub fn as_tcp_keepalive_config(v: &Yaml) -> anyhow::Result { pub fn as_tcp_misc_sock_opts(v: &Yaml) -> anyhow::Result { let mut config = TcpMiscSockOpts::default(); - if let Yaml::Hash(map) = v { + if let Yaml::Mapping(map) = v { crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { "no_delay" => { let no_delay = @@ -373,9 +368,9 @@ pub fn as_tcp_misc_sock_opts(v: &Yaml) -> anyhow::Result { #[cfg(test)] mod tests { use super::*; + use std::net::{IpAddr, Ipv6Addr, SocketAddr}; use std::time::Duration; - use yaml_rust::Yaml; use vey_types::net::{ HappyEyeballsConfig, TcpConnectConfig, TcpKeepAliveConfig, TcpListenConfig, TcpMiscSockOpts, @@ -444,7 +439,7 @@ mod tests { let mut cfg = TcpListenConfig::default(); assert!(set_tcp_listen_scale(&mut cfg, &yaml_map["scale"]).is_ok()); - let yaml_value = Yaml::Real("2.5".to_string()); + let yaml_value = Yaml::Value(Scalar::FloatingPoint((2.5_f64).into())); let mut cfg = TcpListenConfig::default(); assert!(set_tcp_listen_scale(&mut cfg, &yaml_value).is_ok()); diff --git a/lib/vey-yaml/src/value/net/tls.rs b/lib/vey-yaml/src/value/net/tls.rs index 1be0dea05..5cd605e75 100644 --- a/lib/vey-yaml/src/value/net/tls.rs +++ b/lib/vey-yaml/src/value/net/tls.rs @@ -6,17 +6,14 @@ use std::str::FromStr; use anyhow::anyhow; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_types::net::TlsVersion; pub fn as_tls_version(value: &Yaml) -> anyhow::Result { match value { - Yaml::Real(s) => { - let f = f64::from_str(s).map_err(|e| anyhow!("invalid f64 value: {e}"))?; - TlsVersion::try_from(f) - } - Yaml::String(s) => TlsVersion::from_str(s), + Yaml::Value(Scalar::FloatingPoint(n)) => TlsVersion::try_from(**n), + Yaml::Value(Scalar::String(s)) => TlsVersion::from_str(s), _ => Err(anyhow!( "yaml value type for tls version should be 'string' or 'float'" )), @@ -30,30 +27,34 @@ mod tests { #[test] fn as_tls_version_ok() { // Valid float values - let version = as_tls_version(&Yaml::Real("1.0".to_string())).unwrap(); + let version = + as_tls_version(&Yaml::Value(Scalar::FloatingPoint((1.0_f64).into()))).unwrap(); assert_eq!(version, TlsVersion::TLS1_0); - let version = as_tls_version(&Yaml::Real("1.1".to_string())).unwrap(); + let version = + as_tls_version(&Yaml::Value(Scalar::FloatingPoint((1.1_f64).into()))).unwrap(); assert_eq!(version, TlsVersion::TLS1_1); - let version = as_tls_version(&Yaml::Real("1.2".to_string())).unwrap(); + let version = + as_tls_version(&Yaml::Value(Scalar::FloatingPoint((1.2_f64).into()))).unwrap(); assert_eq!(version, TlsVersion::TLS1_2); - let version = as_tls_version(&Yaml::Real("1.3".to_string())).unwrap(); + let version = + as_tls_version(&Yaml::Value(Scalar::FloatingPoint((1.3_f64).into()))).unwrap(); assert_eq!(version, TlsVersion::TLS1_3); // Valid string values (all variants) for s in ["1.0", "tls10", "tls1.0", "tls1_0", "TLS10", "TLS1.0"] { - let version = as_tls_version(&Yaml::String(s.to_string())).unwrap(); + let version = as_tls_version(&yaml_str!(s)).unwrap(); assert_eq!(version, TlsVersion::TLS1_0); } for s in ["1.1", "tls11", "tls1.1", "tls1_1", "TLS11", "TLS1.1"] { - let version = as_tls_version(&Yaml::String(s.to_string())).unwrap(); + let version = as_tls_version(&yaml_str!(s)).unwrap(); assert_eq!(version, TlsVersion::TLS1_1); } for s in ["1.2", "tls12", "tls1.2", "tls1_2", "TLS12", "TLS1.2"] { - let version = as_tls_version(&Yaml::String(s.to_string())).unwrap(); + let version = as_tls_version(&yaml_str!(s)).unwrap(); assert_eq!(version, TlsVersion::TLS1_2); } for s in ["1.3", "tls13", "tls1.3", "tls1_3", "TLS13", "TLS1.3"] { - let version = as_tls_version(&Yaml::String(s.to_string())).unwrap(); + let version = as_tls_version(&yaml_str!(s)).unwrap(); assert_eq!(version, TlsVersion::TLS1_3); } } @@ -61,9 +62,9 @@ mod tests { #[test] fn as_tls_version_err() { // Invalid float values - assert!(as_tls_version(&Yaml::Real("0.9".to_string())).is_err()); - assert!(as_tls_version(&Yaml::Real("2.0".to_string())).is_err()); - assert!(as_tls_version(&Yaml::Real("invalid".to_string())).is_err()); + assert!(as_tls_version(&Yaml::Value(Scalar::FloatingPoint((0.9_f64).into()))).is_err()); + assert!(as_tls_version(&Yaml::Value(Scalar::FloatingPoint((2.0_f64).into()))).is_err()); + assert!(as_tls_version(&yaml_str!("invalid")).is_err()); // Invalid string values assert!(as_tls_version(&yaml_str!("tls0.9")).is_err()); @@ -71,8 +72,8 @@ mod tests { assert!(as_tls_version(&yaml_str!("")).is_err()); // Non-float/string types - assert!(as_tls_version(&Yaml::Boolean(true)).is_err()); - assert!(as_tls_version(&Yaml::Integer(1)).is_err()); - assert!(as_tls_version(&Yaml::Array(vec![])).is_err()); + assert!(as_tls_version(&Yaml::Value(Scalar::Boolean(true))).is_err()); + assert!(as_tls_version(&Yaml::Value(Scalar::Integer(1))).is_err()); + assert!(as_tls_version(&Yaml::Sequence(vec![])).is_err()); } } diff --git a/lib/vey-yaml/src/value/net/udp.rs b/lib/vey-yaml/src/value/net/udp.rs index 593f40102..a488d2c6a 100644 --- a/lib/vey-yaml/src/value/net/udp.rs +++ b/lib/vey-yaml/src/value/net/udp.rs @@ -7,14 +7,14 @@ use std::str::FromStr; use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_types::net::{UdpConnectionTrackConfig, UdpListenConfig, UdpMiscSockOpts}; pub fn as_udp_misc_sock_opts(v: &Yaml) -> anyhow::Result { let mut config = UdpMiscSockOpts::default(); - if let Yaml::Hash(map) = v { + if let Yaml::Mapping(map) = v { crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { "time_to_live" | "ttl" => { let ttl = @@ -82,9 +82,9 @@ pub fn as_udp_misc_sock_opts(v: &Yaml) -> anyhow::Result { fn set_udp_listen_scale(config: &mut UdpListenConfig, v: &Yaml) -> anyhow::Result<()> { match v { - Yaml::String(s) => { - if s.ends_with('%') { - let Ok(v) = f64::from_str(&s[..s.len() - 1]) else { + Yaml::Value(Scalar::String(s)) => { + if let Some(percent) = s.strip_suffix('%') { + let Ok(v) = f64::from_str(percent) else { return Err(anyhow!("invalid percentage value {s}")); }; config @@ -107,17 +107,12 @@ fn set_udp_listen_scale(config: &mut UdpListenConfig, v: &Yaml) -> anyhow::Resul .context(format!("unsupported float value {s}")) } } - Yaml::Integer(i) => config + Yaml::Value(Scalar::Integer(i)) => config .set_scale(*i as f64) .context(format!("unsupported integer value {i}")), - Yaml::Real(s) => { - let Ok(v) = f64::from_str(s) else { - return Err(anyhow!("invalid float value: {s}")); - }; - config - .set_scale(v) - .context(format!("unsupported float value {s}")) - } + Yaml::Value(Scalar::FloatingPoint(n)) => config + .set_scale(**n) + .context(format!("unsupported float value {n}")), _ => Err(anyhow!( "yaml value type for udp listen scale value should be 'str' or 'float'" )), @@ -128,16 +123,16 @@ pub fn as_udp_listen_config(value: &Yaml) -> anyhow::Result { let mut config = UdpListenConfig::default(); match value { - Yaml::Integer(i) => { + Yaml::Value(Scalar::Integer(i)) => { let port = u16::try_from(*i).map_err(|e| anyhow!("out of range u16 value: {e}"))?; config.set_port(port); } - Yaml::String(_) => { + Yaml::Value(Scalar::String(_)) => { let addr = crate::value::as_env_sockaddr(value) .context("invalid udp listen socket address value")?; config.set_socket_address(addr); } - Yaml::Hash(map) => { + Yaml::Mapping(map) => { crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { "addr" | "address" => { let addr = crate::value::as_env_sockaddr(v).context(format!( @@ -209,7 +204,7 @@ pub fn as_udp_listen_config(value: &Yaml) -> anyhow::Result { } pub fn as_udp_conn_track_config(value: &Yaml) -> anyhow::Result { - let Yaml::Hash(map) = value else { + let Yaml::Mapping(map) = value else { return Err(anyhow!( "yaml value type for udp connection track config value should be 'map'" )); @@ -264,6 +259,7 @@ pub fn as_udp_conn_track_config(value: &Yaml) -> anyhow::Result anyhow::Result> { const MAX_FILE_SIZE: usize = 4_000_000; // 4MB - if let Yaml::String(s) = value + if let Yaml::Value(Scalar::String(s)) = value && s.trim_start().starts_with("--") { let certs = X509::stack_from_pem(s.as_bytes()) @@ -58,7 +58,7 @@ pub fn as_openssl_certificates( value: &Yaml, lookup_dir: Option<&Path>, ) -> anyhow::Result> { - if let Yaml::Array(seq) = value { + if let Yaml::Sequence(seq) = value { let mut certs = Vec::new(); for (i, v) in seq.iter().enumerate() { let this_certs = as_certificates_from_single_element(v, lookup_dir) @@ -77,7 +77,7 @@ pub fn as_openssl_private_key( ) -> anyhow::Result> { const MAX_FILE_SIZE: usize = 256_000; // 256KB - if let Yaml::String(s) = value + if let Yaml::Value(Scalar::String(s)) = value && s.trim_start().starts_with("--") { return PKey::private_key_from_pem(s.as_bytes()) @@ -97,7 +97,7 @@ pub fn as_openssl_certificate_pair( value: &Yaml, lookup_dir: Option<&Path>, ) -> anyhow::Result { - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { let mut pair = OpensslCertificatePair::default(); crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { @@ -131,7 +131,7 @@ pub fn as_openssl_tlcp_certificate_pair( value: &Yaml, lookup_dir: Option<&Path>, ) -> anyhow::Result { - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { let mut pair = OpensslTlcpCertificatePair::default(); crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { @@ -176,7 +176,7 @@ pub fn as_openssl_tlcp_certificate_pair( } fn as_openssl_protocol(value: &Yaml) -> anyhow::Result { - if let Yaml::String(s) = value { + if let Yaml::Value(Scalar::String(s)) = value { OpensslProtocol::from_str(s) } else { Err(anyhow!( @@ -188,16 +188,16 @@ fn as_openssl_protocol(value: &Yaml) -> anyhow::Result { fn as_openssl_ciphers(value: &Yaml) -> anyhow::Result> { let mut ciphers = Vec::new(); match value { - Yaml::String(s) => { + Yaml::Value(Scalar::String(s)) => { for cipher in s.split(':') { ciphers.push(cipher.to_owned()); } Ok(ciphers) } - Yaml::Array(seq) => { + Yaml::Sequence(seq) => { for (i, v) in seq.iter().enumerate() { - if let Yaml::String(s) = v { - ciphers.push(s.clone()); + if let Yaml::Value(Scalar::String(s)) = v { + ciphers.push(s.to_string()); } else { return Err(anyhow!("invalid cipher string for #{i}")); } @@ -215,7 +215,7 @@ fn set_openssl_tls_client_config_builder( value: &Yaml, lookup_dir: Option<&Path>, ) -> anyhow::Result { - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { let mut cert_pair = OpensslCertificatePair::default(); crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { @@ -395,7 +395,7 @@ pub fn as_tls_interception_client_config_builder( value: &Yaml, lookup_dir: Option<&Path>, ) -> anyhow::Result { - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { let mut builder = OpensslInterceptionClientConfigBuilder::default(); crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { @@ -499,12 +499,12 @@ pub fn as_openssl_tls_server_config_builder( value: &Yaml, lookup_dir: Option<&Path>, ) -> anyhow::Result { - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { let mut builder = OpensslServerConfigBuilder::empty(); crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { "cert_pairs" => { - if let Yaml::Array(seq) = v { + if let Yaml::Sequence(seq) = v { for (i, v) in seq.iter().enumerate() { let pair = as_openssl_certificate_pair(v, lookup_dir) .context(format!("invalid openssl cert pair value for {k}#{i}"))?; @@ -522,7 +522,7 @@ pub fn as_openssl_tls_server_config_builder( Ok(()) } "tlcp_cert_pairs" => { - if let Yaml::Array(seq) = v { + if let Yaml::Sequence(seq) = v { for (i, v) in seq.iter().enumerate() { let pair = as_openssl_tlcp_certificate_pair(v, lookup_dir) .context(format!("invalid openssl tlcp cert pair value for {k}#{i}"))?; @@ -588,7 +588,7 @@ pub fn as_openssl_tls_server_config_builder( pub fn as_tls_interception_server_config_builder( value: &Yaml, ) -> anyhow::Result { - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { let mut builder = OpensslInterceptionServerConfigBuilder::default(); crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { @@ -613,12 +613,14 @@ pub fn as_tls_interception_server_config_builder( #[cfg(test)] mod tests { use super::*; + use saphyr::LoadableYamlNode; + use std::fs; use std::path::PathBuf; use std::sync::atomic::{AtomicUsize, Ordering}; use std::time::Duration; + use vey_types::net::TlsVersion; - use yaml_rust::YamlLoader; const TEST_CERT_PEM1: &str = include_str!("./test_data/test_cert1.pem"); const TEST_CERT_PEM2: &str = include_str!("./test_data/test_cert2.pem"); @@ -659,20 +661,17 @@ mod tests { fs::write(&cert_path, TEST_CERT_PEM1).unwrap(); // string value (PEM) - let yaml = Yaml::String(TEST_CERT_PEM1.to_string()); + let yaml = yaml_str!(TEST_CERT_PEM1); let certs = as_openssl_certificates(&yaml, None).unwrap(); assert!(!certs.is_empty()); // file path - let yaml = YamlLoader::load_from_str(&format!("|-\n {}", cert_path.display())).unwrap(); + let yaml = Yaml::load_from_str(&format!("|-\n {}", cert_path.display())).unwrap(); let certs = as_openssl_certificates(&yaml[0], Some(test_dir_path)).unwrap(); assert!(!certs.is_empty()); // array of strings - let yaml = Yaml::Array(vec![ - Yaml::String(TEST_CERT_PEM1.to_string()), - Yaml::String(TEST_CERT_PEM1.to_string()), - ]); + let yaml = Yaml::Sequence(vec![yaml_str!(TEST_CERT_PEM1), yaml_str!(TEST_CERT_PEM1)]); let certs = as_openssl_certificates(&yaml, None).unwrap(); assert_eq!(certs.len(), 2); } @@ -700,7 +699,7 @@ mod tests { let test_dir_path = temp_dir.path(); let cert_path = test_dir_path.join("empty_cert.pem"); fs::write(&cert_path, "").unwrap(); - let yaml = YamlLoader::load_from_str(&format!("|-\n {}", cert_path.display())).unwrap(); + let yaml = Yaml::load_from_str(&format!("|-\n {}", cert_path.display())).unwrap(); assert!(as_openssl_certificates(&yaml[0], Some(test_dir_path)).is_err()); } @@ -712,12 +711,12 @@ mod tests { fs::write(&key_path, TEST_KEY_PEM1).unwrap(); // string value (PEM) - let yaml = Yaml::String(TEST_KEY_PEM1.to_string()); + let yaml = yaml_str!(TEST_KEY_PEM1); let key = as_openssl_private_key(&yaml, None).unwrap(); assert!(key.private_key_to_pem_pkcs8().is_ok()); // file path - let yaml = YamlLoader::load_from_str(&format!("|-\n {}", key_path.display())).unwrap(); + let yaml = Yaml::load_from_str(&format!("|-\n {}", key_path.display())).unwrap(); let key = as_openssl_private_key(&yaml[0], Some(test_dir_path)).unwrap(); assert!(key.private_key_to_pem_pkcs8().is_ok()); } @@ -742,7 +741,7 @@ mod tests { let key_path = test_dir_path.join("test_key.pem"); fs::write(&key_path, TEST_KEY_PEM1).unwrap(); - let yaml = YamlLoader::load_from_str(&format!( + let yaml = Yaml::load_from_str(&format!( r#" certificate: |- {} @@ -756,7 +755,7 @@ mod tests { let pair = as_openssl_certificate_pair(&yaml[0], Some(test_dir_path)).unwrap(); assert!(pair.is_set()); - let yaml = YamlLoader::load_from_str(&format!( + let yaml = Yaml::load_from_str(&format!( r#" cert: |- {} @@ -777,7 +776,7 @@ mod tests { let yaml = yaml_str!("invalid"); assert!(as_openssl_certificate_pair(&yaml, None).is_err()); - let yaml = Yaml::Boolean(false); + let yaml = Yaml::Value(Scalar::Boolean(false)); assert!(as_openssl_certificate_pair(&yaml, None).is_err()); // empty map @@ -815,7 +814,7 @@ mod tests { let enc_key_path = test_dir_path.join("enc_key.pem"); fs::write(&enc_key_path, TEST_KEY_PEM2).unwrap(); - let yaml = YamlLoader::load_from_str(&format!( + let yaml = Yaml::load_from_str(&format!( r#" sign_certificate: |- {} @@ -842,7 +841,7 @@ mod tests { let yaml = yaml_str!("invalid"); assert!(as_openssl_tlcp_certificate_pair(&yaml, None).is_err()); - let yaml = Yaml::Null; + let yaml = Yaml::Value(Scalar::Null); assert!(as_openssl_tlcp_certificate_pair(&yaml, None).is_err()); // empty map @@ -885,7 +884,7 @@ mod tests { fs::write(&sign_key_path, TEST_KEY_PEM1).unwrap(); let enc_key_path = test_dir_path.join("enc_key.pem"); fs::write(&enc_key_path, TEST_KEY_PEM2).unwrap(); - let yaml = YamlLoader::load_from_str(&format!( + let yaml = Yaml::load_from_str(&format!( r#" cert: |- {} @@ -897,7 +896,7 @@ mod tests { )) .unwrap(); let cert_pair = as_openssl_certificate_pair(&yaml[0], Some(test_dir_path)).unwrap(); - let yaml = YamlLoader::load_from_str(&format!( + let yaml = Yaml::load_from_str(&format!( r#" sign_certificate: |- {} @@ -917,7 +916,7 @@ mod tests { let tlcp_cert_pair = as_openssl_tlcp_certificate_pair(&yaml[0], Some(test_dir_path)).unwrap(); - let yaml = YamlLoader::load_from_str(&format!( + let yaml = Yaml::load_from_str(&format!( r#" protocol: "tls12" min_tls_version: "tls1.2" @@ -1034,7 +1033,7 @@ mod tests { fs::write(&cert_path, TEST_CERT_PEM1).unwrap(); let key_path = test_dir_path.join("test_key.pem"); fs::write(&key_path, TEST_KEY_PEM1).unwrap(); - let yaml = YamlLoader::load_from_str(&format!( + let yaml = Yaml::load_from_str(&format!( r#" cert: |- {} @@ -1073,7 +1072,7 @@ mod tests { fs::write(&sign_key_path, TEST_KEY_PEM1).unwrap(); let enc_key_path = test_dir_path.join("enc_key.pem"); fs::write(&enc_key_path, TEST_KEY_PEM2).unwrap(); - let yaml = YamlLoader::load_from_str(&format!( + let yaml = Yaml::load_from_str(&format!( r#" cert: |- {} @@ -1085,7 +1084,7 @@ mod tests { )) .unwrap(); let cert_pair = as_openssl_certificate_pair(&yaml[0], Some(test_dir_path)).unwrap(); - let yaml = YamlLoader::load_from_str(&format!( + let yaml = Yaml::load_from_str(&format!( r#" sign_certificate: |- {} @@ -1105,7 +1104,7 @@ mod tests { let tlcp_cert_pair = as_openssl_tlcp_certificate_pair(&yaml[0], Some(test_dir_path)).unwrap(); - let yaml = YamlLoader::load_from_str(&format!( + let yaml = Yaml::load_from_str(&format!( r#" protocol: "tls12" tls_version_min: "tls1.2" @@ -1229,7 +1228,7 @@ mod tests { let cert_path = test_dir_path.join("test_cert.pem"); fs::write(&cert_path, TEST_CERT_PEM1).unwrap(); - let yaml = YamlLoader::load_from_str(&format!( + let yaml = Yaml::load_from_str(&format!( r#" min_tls_version: "tls1.2" max_tls_version: "tls1.3" @@ -1271,7 +1270,7 @@ mod tests { assert_eq!(builder, expected); // alias keys - let yaml = YamlLoader::load_from_str(&format!( + let yaml = Yaml::load_from_str(&format!( r#" tls_version_min: "tls1.2" tls_version_max: "tls1.3" @@ -1305,7 +1304,7 @@ mod tests { let yaml = yaml_str!("invalid"); assert!(as_tls_interception_client_config_builder(&yaml, None).is_err()); - let yaml = Yaml::Boolean(false); + let yaml = Yaml::Value(Scalar::Boolean(false)); assert!(as_tls_interception_client_config_builder(&yaml, None).is_err()); // invalid min_tls_version @@ -1341,7 +1340,7 @@ mod tests { fs::write(&sign_key_path, TEST_KEY_PEM1).unwrap(); let enc_key_path = test_dir_path.join("enc_key.pem"); fs::write(&enc_key_path, TEST_KEY_PEM2).unwrap(); - let yaml = YamlLoader::load_from_str(&format!( + let yaml = Yaml::load_from_str(&format!( r#" cert: |- {} @@ -1354,7 +1353,7 @@ mod tests { .unwrap(); let cert_pair1 = as_openssl_certificate_pair(&yaml[0], Some(test_dir_path)).unwrap(); let cert_pair2 = as_openssl_certificate_pair(&yaml[0], Some(test_dir_path)).unwrap(); - let yaml = YamlLoader::load_from_str(&format!( + let yaml = Yaml::load_from_str(&format!( r#" sign_certificate: |- {} @@ -1376,7 +1375,7 @@ mod tests { let tlcp_cert_pair2 = as_openssl_tlcp_certificate_pair(&yaml[0], Some(test_dir_path)).unwrap(); - let yaml = YamlLoader::load_from_str(&format!( + let yaml = Yaml::load_from_str(&format!( r#" cert_pairs: certificate: |- @@ -1425,7 +1424,7 @@ mod tests { assert_eq!(builder, expected); // array yaml type for cert_pairs and tlcp_cert_pairs - let yaml = YamlLoader::load_from_str(&format!( + let yaml = Yaml::load_from_str(&format!( r#" cert_pairs: - certificate: |- @@ -1463,7 +1462,7 @@ mod tests { let yaml = yaml_str!("invalid"); assert!(as_openssl_tls_server_config_builder(&yaml, None).is_err()); - let yaml = Yaml::Null; + let yaml = Yaml::Value(Scalar::Null); assert!(as_openssl_tls_server_config_builder(&yaml, None).is_err()); // invalid cert_pairs @@ -1550,7 +1549,7 @@ mod tests { let yaml = yaml_str!("invalid"); assert!(as_tls_interception_server_config_builder(&yaml).is_err()); - let yaml = Yaml::Integer(123); + let yaml = Yaml::Value(Scalar::Integer(123)); assert!(as_tls_interception_server_config_builder(&yaml).is_err()); // unknown key diff --git a/lib/vey-yaml/src/value/primary.rs b/lib/vey-yaml/src/value/primary.rs index 0ae545680..755358088 100644 --- a/lib/vey-yaml/src/value/primary.rs +++ b/lib/vey-yaml/src/value/primary.rs @@ -11,12 +11,12 @@ use std::str::FromStr; use anyhow::{Context, anyhow}; use ascii::AsciiString; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; pub fn as_u8(v: &Yaml) -> anyhow::Result { match v { - Yaml::String(s) => Ok(u8::from_str(s)?), - Yaml::Integer(i) => Ok(u8::try_from(*i)?), + Yaml::Value(Scalar::String(s)) => Ok(u8::from_str(s)?), + Yaml::Value(Scalar::Integer(i)) => Ok(u8::try_from(*i)?), _ => Err(anyhow!( "yaml value type for 'u8' should be 'string' or 'integer'" )), @@ -25,8 +25,8 @@ pub fn as_u8(v: &Yaml) -> anyhow::Result { pub fn as_u16(v: &Yaml) -> anyhow::Result { match v { - Yaml::String(s) => Ok(u16::from_str(s)?), - Yaml::Integer(i) => Ok(u16::try_from(*i)?), + Yaml::Value(Scalar::String(s)) => Ok(u16::from_str(s)?), + Yaml::Value(Scalar::Integer(i)) => Ok(u16::try_from(*i)?), _ => Err(anyhow!( "yaml value type for 'u16' should be 'string' or 'integer'" )), @@ -35,8 +35,8 @@ pub fn as_u16(v: &Yaml) -> anyhow::Result { pub fn as_u32(v: &Yaml) -> anyhow::Result { match v { - Yaml::String(s) => Ok(u32::from_str(s)?), - Yaml::Integer(i) => Ok(u32::try_from(*i)?), + Yaml::Value(Scalar::String(s)) => Ok(u32::from_str(s)?), + Yaml::Value(Scalar::Integer(i)) => Ok(u32::try_from(*i)?), _ => Err(anyhow!( "yaml value type for 'u32' should be 'string' or 'integer'" )), @@ -45,8 +45,8 @@ pub fn as_u32(v: &Yaml) -> anyhow::Result { pub fn as_nonzero_u32(v: &Yaml) -> anyhow::Result { match v { - Yaml::String(s) => Ok(NonZeroU32::from_str(s)?), - Yaml::Integer(i) => { + Yaml::Value(Scalar::String(s)) => Ok(NonZeroU32::from_str(s)?), + Yaml::Value(Scalar::Integer(i)) => { let u = u32::try_from(*i)?; Ok(NonZeroU32::try_from(u)?) } @@ -58,8 +58,8 @@ pub fn as_nonzero_u32(v: &Yaml) -> anyhow::Result { pub fn as_u64(v: &Yaml) -> anyhow::Result { match v { - Yaml::String(s) => Ok(u64::from_str(s)?), - Yaml::Integer(i) => Ok(u64::try_from(*i)?), + Yaml::Value(Scalar::String(s)) => Ok(u64::from_str(s)?), + Yaml::Value(Scalar::Integer(i)) => Ok(u64::try_from(*i)?), _ => Err(anyhow!( "yaml value type for 'u64' should be 'string' or 'integer'" )), @@ -68,8 +68,8 @@ pub fn as_u64(v: &Yaml) -> anyhow::Result { pub fn as_i32(v: &Yaml) -> anyhow::Result { match v { - Yaml::String(s) => Ok(i32::from_str(s)?), - Yaml::Integer(i) => Ok(i32::try_from(*i)?), + Yaml::Value(Scalar::String(s)) => Ok(i32::from_str(s)?), + Yaml::Value(Scalar::Integer(i)) => Ok(i32::try_from(*i)?), _ => Err(anyhow!( "yaml value type for 'i32' should be 'string' or 'integer'" )), @@ -78,8 +78,8 @@ pub fn as_i32(v: &Yaml) -> anyhow::Result { pub fn as_nonzero_i32(v: &Yaml) -> anyhow::Result { match v { - Yaml::String(s) => Ok(NonZeroI32::from_str(s)?), - Yaml::Integer(i) => { + Yaml::Value(Scalar::String(s)) => Ok(NonZeroI32::from_str(s)?), + Yaml::Value(Scalar::Integer(i)) => { let u = i32::try_from(*i)?; Ok(NonZeroI32::try_from(u)?) } @@ -91,8 +91,8 @@ pub fn as_nonzero_i32(v: &Yaml) -> anyhow::Result { pub fn as_i64(v: &Yaml) -> anyhow::Result { match v { - Yaml::String(s) => Ok(i64::from_str(s)?), - Yaml::Integer(i) => Ok(*i), + Yaml::Value(Scalar::String(s)) => Ok(i64::from_str(s)?), + Yaml::Value(Scalar::Integer(i)) => Ok(*i), _ => Err(anyhow!( "yaml value type for 'i64' should be 'string' or 'integer'" )), @@ -101,9 +101,9 @@ pub fn as_i64(v: &Yaml) -> anyhow::Result { pub fn as_f64(v: &Yaml) -> anyhow::Result { match v { - Yaml::String(s) => Ok(f64::from_str(s)?), - Yaml::Integer(i) => Ok(*i as f64), - Yaml::Real(s) => Ok(f64::from_str(s)?), + Yaml::Value(Scalar::String(s)) => Ok(f64::from_str(s)?), + Yaml::Value(Scalar::Integer(i)) => Ok(*i as f64), + Yaml::Value(Scalar::FloatingPoint(n)) => Ok(**n), _ => Err(anyhow!( "yaml value type for 'f64' should be 'string', 'integer' or 'real'" )), @@ -112,13 +112,13 @@ pub fn as_f64(v: &Yaml) -> anyhow::Result { pub fn as_bool(v: &Yaml) -> anyhow::Result { match v { - Yaml::String(s) => match s.to_lowercase().as_str() { + Yaml::Value(Scalar::String(s)) => match s.to_lowercase().as_str() { "on" | "true" | "yes" | "1" => Ok(true), "off" | "false" | "no" | "0" => Ok(false), _ => Err(anyhow!("invalid yaml string value for 'bool': {s}")), }, - Yaml::Boolean(value) => Ok(*value), - Yaml::Integer(i) => Ok(*i != 0), + Yaml::Value(Scalar::Boolean(value)) => Ok(*value), + Yaml::Value(Scalar::Integer(i)) => Ok(*i != 0), _ => Err(anyhow!( "yaml value type for 'bool' should be 'boolean' / 'string' / 'integer'" )), @@ -127,8 +127,8 @@ pub fn as_bool(v: &Yaml) -> anyhow::Result { pub fn as_nonzero_isize(v: &Yaml) -> anyhow::Result { match v { - Yaml::String(s) => Ok(NonZeroIsize::from_str(s)?), - Yaml::Integer(i) => { + Yaml::Value(Scalar::String(s)) => Ok(NonZeroIsize::from_str(s)?), + Yaml::Value(Scalar::Integer(i)) => { let u = isize::try_from(*i)?; Ok(NonZeroIsize::try_from(u)?) } @@ -140,8 +140,8 @@ pub fn as_nonzero_isize(v: &Yaml) -> anyhow::Result { pub fn as_usize(v: &Yaml) -> anyhow::Result { match v { - Yaml::String(s) => Ok(usize::from_str(s)?), - Yaml::Integer(i) => Ok(usize::try_from(*i)?), + Yaml::Value(Scalar::String(s)) => Ok(usize::from_str(s)?), + Yaml::Value(Scalar::Integer(i)) => Ok(usize::try_from(*i)?), _ => Err(anyhow!( "yaml value type for 'usize' should be 'string' or 'integer'" )), @@ -150,8 +150,8 @@ pub fn as_usize(v: &Yaml) -> anyhow::Result { pub fn as_nonzero_usize(v: &Yaml) -> anyhow::Result { match v { - Yaml::String(s) => Ok(NonZeroUsize::from_str(s)?), - Yaml::Integer(i) => { + Yaml::Value(Scalar::String(s)) => Ok(NonZeroUsize::from_str(s)?), + Yaml::Value(Scalar::Integer(i)) => { let u = usize::try_from(*i)?; Ok(NonZeroUsize::try_from(u)?) } @@ -163,8 +163,8 @@ pub fn as_nonzero_usize(v: &Yaml) -> anyhow::Result { pub fn as_char(v: &Yaml) -> anyhow::Result { match v { - Yaml::String(s) => char::from_str(s).map_err(anyhow::Error::from), - Yaml::Integer(i) => { + Yaml::Value(Scalar::String(s)) => char::from_str(s).map_err(anyhow::Error::from), + Yaml::Value(Scalar::Integer(i)) => { let n = u32::try_from(*i).map_err(|_| anyhow!("out of range integer value {i}"))?; char::from_u32(n).ok_or(anyhow!("out of range integer value {n}")) } @@ -181,9 +181,9 @@ pub fn as_ascii(v: &Yaml) -> anyhow::Result { pub fn as_string(v: &Yaml) -> anyhow::Result { match v { - Yaml::String(s) => Ok(s.clone()), - Yaml::Integer(i) => Ok(i.to_string()), - Yaml::Real(s) => Ok(s.to_string()), + Yaml::Value(Scalar::String(s)) => Ok(s.to_string()), + Yaml::Value(Scalar::Integer(i)) => Ok(i.to_string()), + Yaml::Value(Scalar::FloatingPoint(n)) => Ok(n.to_string()), _ => Err(anyhow!( "yaml value type for string should be 'string' / 'integer' / 'real'" )), @@ -196,7 +196,7 @@ where { let mut vec = Vec::new(); match v { - Yaml::Array(seq) => { + Yaml::Sequence(seq) => { for (i, v) in seq.iter().enumerate() { let node = convert(v).context(format!("invalid value for list element #{i}"))?; vec.push(node); @@ -220,7 +220,7 @@ where KF: Fn(&Yaml) -> anyhow::Result, VF: Fn(&Yaml) -> anyhow::Result, { - if let Yaml::Hash(map) = v { + if let Yaml::Mapping(map) = v { let mut table = HashMap::new(); for (k, v) in map.iter() { let key = convert_key(k).context(format!("failed to parse key {k:?}"))?; @@ -244,26 +244,26 @@ mod tests { assert_eq!(as_u8(&v).unwrap(), 100); // valid integer input - let v = Yaml::Integer(200); + let v = Yaml::Value(Scalar::Integer(200)); assert_eq!(as_u8(&v).unwrap(), 200); // boundary value (max u8) - let v = Yaml::Integer(255); + let v = Yaml::Value(Scalar::Integer(255)); assert_eq!(as_u8(&v).unwrap(), 255); } #[test] fn as_u8_err() { // overflow - let v = Yaml::Integer(256); + let v = Yaml::Value(Scalar::Integer(256)); assert!(as_u8(&v).is_err()); // negative number - let v = Yaml::Integer(-1); + let v = Yaml::Value(Scalar::Integer(-1)); assert!(as_u8(&v).is_err()); // invalid type - let v = Yaml::Boolean(true); + let v = Yaml::Value(Scalar::Boolean(true)); assert!(as_u8(&v).is_err()); // parse error @@ -278,26 +278,26 @@ mod tests { assert_eq!(as_u16(&v).unwrap(), 50000); // valid integer input - let v = Yaml::Integer(60000); + let v = Yaml::Value(Scalar::Integer(60000)); assert_eq!(as_u16(&v).unwrap(), 60000); // boundary value (max u16) - let v = Yaml::Integer(65535); + let v = Yaml::Value(Scalar::Integer(65535)); assert_eq!(as_u16(&v).unwrap(), 65535); } #[test] fn as_u16_err() { // overflow - let v = Yaml::Integer(65536); + let v = Yaml::Value(Scalar::Integer(65536)); assert!(as_u16(&v).is_err()); // negative number - let v = Yaml::Integer(-1); + let v = Yaml::Value(Scalar::Integer(-1)); assert!(as_u16(&v).is_err()); // invalid type - let v = Yaml::Boolean(false); + let v = Yaml::Value(Scalar::Boolean(false)); assert!(as_u16(&v).is_err()); // parse error @@ -312,26 +312,26 @@ mod tests { assert_eq!(as_u32(&v).unwrap(), 4000000000); // valid integer input - let v = Yaml::Integer(2000000000); + let v = Yaml::Value(Scalar::Integer(2000000000)); assert_eq!(as_u32(&v).unwrap(), 2000000000); // boundary value (max u32) - let v = Yaml::Integer(4294967295); + let v = Yaml::Value(Scalar::Integer(4294967295)); assert_eq!(as_u32(&v).unwrap(), 4294967295); } #[test] fn as_u32_err() { // overflow - let v = Yaml::Integer(4294967296); + let v = Yaml::Value(Scalar::Integer(4294967296)); assert!(as_u32(&v).is_err()); // negative number - let v = Yaml::Integer(-1); + let v = Yaml::Value(Scalar::Integer(-1)); assert!(as_u32(&v).is_err()); // invalid type - let v = Yaml::Null; + let v = Yaml::Value(Scalar::Null); assert!(as_u32(&v).is_err()); // parse error @@ -346,11 +346,11 @@ mod tests { assert_eq!(as_nonzero_u32(&v).unwrap(), NonZeroU32::new(1).unwrap()); // valid integer input - let v = Yaml::Integer(2); + let v = Yaml::Value(Scalar::Integer(2)); assert_eq!(as_nonzero_u32(&v).unwrap(), NonZeroU32::new(2).unwrap()); // boundary value (max u32) - let v = Yaml::Integer(4294967295); + let v = Yaml::Value(Scalar::Integer(4294967295)); assert_eq!( as_nonzero_u32(&v).unwrap(), NonZeroU32::new(4294967295).unwrap() @@ -360,7 +360,7 @@ mod tests { #[test] fn as_nonzero_u32_err() { // overflow - let v = Yaml::Integer(4294967296); + let v = Yaml::Value(Scalar::Integer(4294967296)); assert!(as_nonzero_u32(&v).is_err()); // zero value @@ -368,11 +368,11 @@ mod tests { assert!(as_nonzero_u32(&v).is_err()); // negative number - let v = Yaml::Integer(-1); + let v = Yaml::Value(Scalar::Integer(-1)); assert!(as_nonzero_u32(&v).is_err()); // invalid type - let v = Yaml::Array(vec![]); + let v = Yaml::Sequence(vec![]); assert!(as_nonzero_u32(&v).is_err()); // parse error @@ -387,7 +387,7 @@ mod tests { assert_eq!(as_u64(&v).unwrap(), 18446744073709551615); // valid integer input - let v = Yaml::Integer(8446744073709551615); + let v = Yaml::Value(Scalar::Integer(8446744073709551615)); assert_eq!(as_u64(&v).unwrap(), 8446744073709551615); } @@ -398,11 +398,11 @@ mod tests { assert!(as_u64(&v).is_err()); // negative number - let v = Yaml::Integer(-1); + let v = Yaml::Value(Scalar::Integer(-1)); assert!(as_u64(&v).is_err()); // invalid type - let v = Yaml::Boolean(false); + let v = Yaml::Value(Scalar::Boolean(false)); assert!(as_u64(&v).is_err()); // parse error @@ -420,22 +420,22 @@ mod tests { assert_eq!(as_i32(&v).unwrap(), 0); // valid integer input - let v = Yaml::Integer(2147483647); + let v = Yaml::Value(Scalar::Integer(2147483647)); assert_eq!(as_i32(&v).unwrap(), 2147483647); } #[test] fn as_i32_err() { // overflow - let v = Yaml::Integer(2147483648); + let v = Yaml::Value(Scalar::Integer(2147483648)); assert!(as_i32(&v).is_err()); // underflow - let v = Yaml::Integer(-2147483649); + let v = Yaml::Value(Scalar::Integer(-2147483649)); assert!(as_i32(&v).is_err()); // invalid type - let v = Yaml::Boolean(true); + let v = Yaml::Value(Scalar::Boolean(true)); assert!(as_i32(&v).is_err()); // parse error @@ -446,20 +446,20 @@ mod tests { #[test] fn as_nonzero_i32_ok() { // valid positive value - let v = yaml_str!(1); + let v = yaml_str!("1"); assert_eq!(as_nonzero_i32(&v).unwrap(), NonZeroI32::new(1).unwrap()); - let v = Yaml::Integer(2147483647); + let v = Yaml::Value(Scalar::Integer(2147483647)); assert_eq!( as_nonzero_i32(&v).unwrap(), NonZeroI32::new(2147483647).unwrap() ); // valid negative value - let v = yaml_str!(-1); + let v = yaml_str!("-1"); assert_eq!(as_nonzero_i32(&v).unwrap(), NonZeroI32::new(-1).unwrap()); - let v = Yaml::Integer(-2147483648); + let v = Yaml::Value(Scalar::Integer(-2147483648)); assert_eq!( as_nonzero_i32(&v).unwrap(), NonZeroI32::new(-2147483648).unwrap() @@ -473,15 +473,15 @@ mod tests { assert!(as_nonzero_i32(&v).is_err()); // overflow - let v = Yaml::Integer(2147483648); + let v = Yaml::Value(Scalar::Integer(2147483648)); assert!(as_nonzero_i32(&v).is_err()); // underflow - let v = Yaml::Integer(-2147483649); + let v = Yaml::Value(Scalar::Integer(-2147483649)); assert!(as_nonzero_i32(&v).is_err()); // invalid type - let v = Yaml::Null; + let v = Yaml::Value(Scalar::Null); assert!(as_nonzero_i32(&v).is_err()); // parse error @@ -499,7 +499,7 @@ mod tests { assert_eq!(as_i64(&v).unwrap(), 0); // valid integer input - let v = Yaml::Integer(9223372036854775807); + let v = Yaml::Value(Scalar::Integer(9223372036854775807)); assert_eq!(as_i64(&v).unwrap(), 9223372036854775807); } @@ -514,7 +514,7 @@ mod tests { assert!(as_i64(&v).is_err()); // invalid type - let v = Yaml::Real("1.234e10".into()); + let v = Yaml::Value(Scalar::FloatingPoint((12340000000.0_f64).into())); assert!(as_i64(&v).is_err()); // parse error @@ -529,11 +529,11 @@ mod tests { assert_eq!(as_f64(&v).unwrap(), std::f64::consts::PI); // valid integer input - let v = Yaml::Integer(42); + let v = Yaml::Value(Scalar::Integer(42)); assert_eq!(as_f64(&v).unwrap(), 42.0); // valid real input - let v = Yaml::Real("1.234e10".into()); + let v = Yaml::Value(Scalar::FloatingPoint((12340000000.0_f64).into())); assert_eq!(as_f64(&v).unwrap(), 1.234e10); } @@ -544,7 +544,7 @@ mod tests { assert!(as_f64(&v).is_err()); // invalid type - let v = Yaml::Boolean(true); + let v = Yaml::Value(Scalar::Boolean(true)); assert!(as_f64(&v).is_err()); } @@ -563,12 +563,12 @@ mod tests { assert!(!as_bool(&yaml_str!("0")).unwrap()); // boolean values - assert!(as_bool(&Yaml::Boolean(true)).unwrap()); - assert!(!as_bool(&Yaml::Boolean(false)).unwrap()); + assert!(as_bool(&Yaml::Value(Scalar::Boolean(true))).unwrap()); + assert!(!as_bool(&Yaml::Value(Scalar::Boolean(false))).unwrap()); // integer values - assert!(as_bool(&Yaml::Integer(1)).unwrap()); - assert!(!as_bool(&Yaml::Integer(0)).unwrap()); + assert!(as_bool(&Yaml::Value(Scalar::Integer(1))).unwrap()); + assert!(!as_bool(&Yaml::Value(Scalar::Integer(0))).unwrap()); } #[test] @@ -578,21 +578,21 @@ mod tests { assert!(as_bool(&v).is_err()); // invalid type - let v = Yaml::Real("123.45".into()); + let v = Yaml::Value(Scalar::FloatingPoint((123.45_f64).into())); assert!(as_bool(&v).is_err()); } #[test] fn as_nonzero_isize_ok() { // positive value - let v = Yaml::Integer(1); + let v = Yaml::Value(Scalar::Integer(1)); assert_eq!(as_nonzero_isize(&v).unwrap(), NonZeroIsize::new(1).unwrap()); let v = yaml_str!("2"); assert_eq!(as_nonzero_isize(&v).unwrap(), NonZeroIsize::new(2).unwrap()); // negative value - let v = Yaml::Integer(-1); + let v = Yaml::Value(Scalar::Integer(-1)); assert_eq!( as_nonzero_isize(&v).unwrap(), NonZeroIsize::new(-1).unwrap() @@ -608,14 +608,14 @@ mod tests { #[test] fn as_nonzero_isize_err() { // zero value - let v = Yaml::Integer(0); + let v = Yaml::Value(Scalar::Integer(0)); assert!(as_nonzero_isize(&v).is_err()); let v = yaml_str!("0"); assert!(as_nonzero_isize(&v).is_err()); // invalid type - let v = Yaml::Null; + let v = Yaml::Value(Scalar::Null); assert!(as_nonzero_isize(&v).is_err()); } @@ -626,18 +626,18 @@ mod tests { assert_eq!(as_usize(&v).unwrap(), 100); // valid integer input - let v = Yaml::Integer(200); + let v = Yaml::Value(Scalar::Integer(200)); assert_eq!(as_usize(&v).unwrap(), 200); } #[test] fn as_usize_err() { // negative number - let v = Yaml::Integer(-1); + let v = Yaml::Value(Scalar::Integer(-1)); assert!(as_usize(&v).is_err()); // invalid type - let v = Yaml::Array(vec![]); + let v = Yaml::Sequence(vec![]); assert!(as_usize(&v).is_err()); } @@ -648,7 +648,7 @@ mod tests { assert_eq!(as_nonzero_usize(&v).unwrap(), NonZeroUsize::new(1).unwrap()); // valid integer input - let v = Yaml::Integer(2); + let v = Yaml::Value(Scalar::Integer(2)); assert_eq!(as_nonzero_usize(&v).unwrap(), NonZeroUsize::new(2).unwrap()); } @@ -659,11 +659,11 @@ mod tests { assert!(as_nonzero_usize(&v).is_err()); // negative number - let v = Yaml::Integer(-1); + let v = Yaml::Value(Scalar::Integer(-1)); assert!(as_nonzero_usize(&v).is_err()); // invalid type - let v = Yaml::Null; + let v = Yaml::Value(Scalar::Null); assert!(as_nonzero_usize(&v).is_err()); } @@ -684,7 +684,7 @@ mod tests { assert!(as_ascii(&v).is_err()); // invalid type - let v = Yaml::Array(vec![]); + let v = Yaml::Sequence(vec![]); assert!(as_ascii(&v).is_err()); } @@ -695,33 +695,37 @@ mod tests { assert_eq!(as_string(&v).unwrap(), "123.0"); // Valid integer - let v = Yaml::Integer(123); + let v = Yaml::Value(Scalar::Integer(123)); assert_eq!(as_string(&v).unwrap(), "123"); // Valid negative integer - let v = Yaml::Integer(-123); + let v = Yaml::Value(Scalar::Integer(-123)); assert_eq!(as_string(&v).unwrap(), "-123"); // Valid real number - let v = Yaml::Real("123.0".into()); - assert_eq!(as_string(&v).unwrap(), "123.0"); + let v = Yaml::Value(Scalar::FloatingPoint((123.0_f64).into())); + assert_eq!(as_string(&v).unwrap(), "123"); } #[test] fn as_string_err() { // Invalid type (boolean) - let v = Yaml::Boolean(true); + let v = Yaml::Value(Scalar::Boolean(true)); assert!(as_string(&v).is_err()); // Invalid type (null) - let v = Yaml::Null; + let v = Yaml::Value(Scalar::Null); assert!(as_string(&v).is_err()); } #[test] fn as_list_ok() { // array input - let v = Yaml::Array(vec![Yaml::Integer(1), Yaml::Integer(2), Yaml::Integer(3)]); + let v = Yaml::Sequence(vec![ + Yaml::Value(Scalar::Integer(1)), + Yaml::Value(Scalar::Integer(2)), + Yaml::Value(Scalar::Integer(3)), + ]); assert_eq!(as_list(&v, as_i32).unwrap(), vec![1, 2, 3]); let v = yaml_doc!("[-1, -2, -3]"); @@ -735,10 +739,10 @@ mod tests { #[test] fn as_list_err() { // conversion error in element - let v = Yaml::Array(vec![ - Yaml::Integer(1), - Yaml::Boolean(true), - Yaml::Integer(3), + let v = Yaml::Sequence(vec![ + Yaml::Value(Scalar::Integer(1)), + Yaml::Value(Scalar::Boolean(true)), + Yaml::Value(Scalar::Integer(3)), ]); assert!(as_list::(&v, as_i32).is_err()); @@ -750,7 +754,7 @@ mod tests { assert!(as_list::(&v, as_i32).is_err()); // invalid type - let v = Yaml::Null; + let v = Yaml::Value(Scalar::Null); assert!(as_list::(&v, as_i32).is_err()); } @@ -792,7 +796,7 @@ mod tests { assert!(as_hashmap(&v, as_string, as_i32).is_err()); // invalid type - let v = Yaml::Null; + let v = Yaml::Value(Scalar::Null); assert!(as_hashmap(&v, as_string, as_i32).is_err()); } } diff --git a/lib/vey-yaml/src/value/quinn.rs b/lib/vey-yaml/src/value/quinn.rs index 8a95dcb2d..ddd297f31 100644 --- a/lib/vey-yaml/src/value/quinn.rs +++ b/lib/vey-yaml/src/value/quinn.rs @@ -5,12 +5,12 @@ */ use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::Yaml; use vey_types::net::{QuinnEndpointConfig, QuinnTransportConfigBuilder}; pub fn as_quinn_endpoint_config(value: &Yaml) -> anyhow::Result { - let Yaml::Hash(map) = value else { + let Yaml::Mapping(map) = value else { return Err(anyhow!( "yaml value type for quinn endpoint config should be 'map'" )); @@ -35,7 +35,7 @@ pub fn as_quinn_endpoint_config(value: &Yaml) -> anyhow::Result anyhow::Result { - let Yaml::Hash(map) = value else { + let Yaml::Mapping(map) = value else { return Err(anyhow!( "yaml value type for quinn transport config should be 'map'" )); @@ -82,6 +82,7 @@ pub fn as_quinn_transport_config(value: &Yaml) -> anyhow::Result anyhow::Result { match value { - Yaml::Real(s) => { - let f = f64::from_str(s).map_err(|e| anyhow!("invalid f64 ratio value: {e}"))?; - Bernoulli::new(f).map_err(|e| anyhow!("out of range f64 ratio: {e}")) + Yaml::Value(Scalar::FloatingPoint(n)) => { + Bernoulli::new(**n).map_err(|e| anyhow!("out of range f64 ratio: {e}")) } - Yaml::Integer(i) => match i { + Yaml::Value(Scalar::Integer(i)) => match i { 0 => Ok(Bernoulli::new(0.0).unwrap()), 1 => Ok(Bernoulli::new(1.0).unwrap()), _ => Err(anyhow!("out of range integer value, only 0 & 1 is allowed")), }, - Yaml::String(s) => { + Yaml::Value(Scalar::String(s)) => { if let Some(p) = s.find('/') { let n1 = u32::from_str(s[0..p].trim()) .map_err(|e| anyhow!("first part is not valid u32: {e}"))?; @@ -38,8 +37,8 @@ pub fn as_random_ratio(value: &Yaml) -> anyhow::Result { Bernoulli::new(f).map_err(|e| anyhow!("out of range f64 ratio: {e}")) } } - Yaml::Boolean(true) => Ok(Bernoulli::new(1.0).unwrap()), - Yaml::Boolean(false) => Ok(Bernoulli::new(0.0).unwrap()), + Yaml::Value(Scalar::Boolean(true)) => Ok(Bernoulli::new(1.0).unwrap()), + Yaml::Value(Scalar::Boolean(false)) => Ok(Bernoulli::new(0.0).unwrap()), _ => Err(anyhow!( "yaml value type for 'random ratio' should be 'f64' or 'string'" )), @@ -53,17 +52,17 @@ mod tests { #[test] fn as_random_ratio_ok() { // valid Real values - let yaml = Yaml::Real("0.5".into()); + let yaml = Yaml::Value(Scalar::FloatingPoint((0.5_f64).into())); assert_eq!(as_random_ratio(&yaml).unwrap().p(), 0.5); - let yaml = Yaml::Real("1.0".into()); + let yaml = Yaml::Value(Scalar::FloatingPoint((1.0_f64).into())); assert_eq!(as_random_ratio(&yaml).unwrap().p(), 1.0); // valid Integer values (0 and 1 only) - let yaml = Yaml::Integer(0); + let yaml = Yaml::Value(Scalar::Integer(0)); assert_eq!(as_random_ratio(&yaml).unwrap().p(), 0.0); - let yaml = Yaml::Integer(1); + let yaml = Yaml::Value(Scalar::Integer(1)); assert_eq!(as_random_ratio(&yaml).unwrap().p(), 1.0); // valid String formats @@ -80,27 +79,27 @@ mod tests { assert_eq!(as_random_ratio(&yaml).unwrap().p(), 0.7); // valid Boolean values - let yaml = Yaml::Boolean(true); + let yaml = Yaml::Value(Scalar::Boolean(true)); assert_eq!(as_random_ratio(&yaml).unwrap().p(), 1.0); - let yaml = Yaml::Boolean(false); + let yaml = Yaml::Value(Scalar::Boolean(false)); assert_eq!(as_random_ratio(&yaml).unwrap().p(), 0.0); } #[test] fn as_random_ratio_err() { // invalid Real values - let yaml = Yaml::Real("abc".into()); + let yaml = yaml_str!("abc"); assert!(as_random_ratio(&yaml).is_err()); - let yaml = Yaml::Real("-1.0".into()); + let yaml = Yaml::Value(Scalar::FloatingPoint((-1.0_f64).into())); assert!(as_random_ratio(&yaml).is_err()); - let yaml = Yaml::Real("2.5".into()); + let yaml = Yaml::Value(Scalar::FloatingPoint((2.5_f64).into())); assert!(as_random_ratio(&yaml).is_err()); // invalid Integer values (not 0 or 1) - let yaml = Yaml::Integer(2); + let yaml = Yaml::Value(Scalar::Integer(2)); assert!(as_random_ratio(&yaml).is_err()); // invalid String formats @@ -129,10 +128,10 @@ mod tests { assert!(as_random_ratio(&yaml).is_err()); // unsupported types - let yaml = Yaml::Array(vec![]); + let yaml = Yaml::Sequence(vec![]); assert!(as_random_ratio(&yaml).is_err()); - let yaml = Yaml::Null; + let yaml = Yaml::Value(Scalar::Null); assert!(as_random_ratio(&yaml).is_err()); } } diff --git a/lib/vey-yaml/src/value/rate_limit.rs b/lib/vey-yaml/src/value/rate_limit.rs index 8174665bd..b4d8b9edb 100644 --- a/lib/vey-yaml/src/value/rate_limit.rs +++ b/lib/vey-yaml/src/value/rate_limit.rs @@ -7,23 +7,23 @@ use std::num::NonZeroU32; use std::str::FromStr; use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_types::limit::RateLimitQuota; pub fn as_rate_limit_quota(v: &Yaml) -> anyhow::Result { match v { - Yaml::Integer(_) => { + Yaml::Value(Scalar::Integer(_)) => { let count = crate::value::as_nonzero_u32(v)?; RateLimitQuota::per_second(count) } - Yaml::String(s) => RateLimitQuota::from_str(s), - Yaml::Hash(map) => { + Yaml::Value(Scalar::String(s)) => RateLimitQuota::from_str(s), + Yaml::Mapping(map) => { let mut quota: Option = None; let mut max_burst: Option = None; crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { "rate" => { - if matches!(v, Yaml::Integer(_) | Yaml::String(_)) { + if matches!(v, Yaml::Value(_)) { quota = Some( as_rate_limit_quota(v).context(format!("invalid value for key {k}"))?, ); @@ -71,7 +71,7 @@ mod tests { let ten = NonZeroU32::new(10).unwrap(); let exp = RateLimitQuota::per_second(ten).unwrap(); - let v = Yaml::Integer(10); + let v = Yaml::Value(Scalar::Integer(10)); let quota = as_rate_limit_quota(&v).unwrap(); assert_eq!(quota, exp); @@ -131,7 +131,7 @@ mod tests { assert!(as_rate_limit_quota(&yaml).is_err()); // invalid yaml value type - let yaml = Yaml::Null; + let yaml = Yaml::Value(Scalar::Null); assert!(as_rate_limit_quota(&yaml).is_err()); } } diff --git a/lib/vey-yaml/src/value/regex.rs b/lib/vey-yaml/src/value/regex.rs index 9510557a2..823355347 100644 --- a/lib/vey-yaml/src/value/regex.rs +++ b/lib/vey-yaml/src/value/regex.rs @@ -5,10 +5,10 @@ use anyhow::anyhow; use regex::Regex; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; pub fn as_regex(value: &Yaml) -> anyhow::Result { - if let Yaml::String(s) = value { + if let Yaml::Value(Scalar::String(s)) = value { let regex = Regex::new(s).map_err(|e| anyhow!("invalid regex value: {e}"))?; Ok(regex) } else { @@ -39,7 +39,7 @@ mod tests { assert!(as_regex(&yaml).is_err()); // non-string type - let yaml = Yaml::Integer(123); + let yaml = Yaml::Value(Scalar::Integer(123)); assert!(as_regex(&yaml).is_err()); } } diff --git a/lib/vey-yaml/src/value/resolve.rs b/lib/vey-yaml/src/value/resolve.rs index 2c4ac4276..8aeeed85c 100644 --- a/lib/vey-yaml/src/value/resolve.rs +++ b/lib/vey-yaml/src/value/resolve.rs @@ -7,7 +7,7 @@ use std::str::FromStr; use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_types::net::Host; use vey_types::resolve::{PickStrategy, QueryStrategy, ResolveRedirectionBuilder, ResolveStrategy}; @@ -16,7 +16,7 @@ const RESOLVE_REDIRECTION_NODE_KEY_TO: &str = "to"; pub fn as_query_strategy(v: &Yaml) -> anyhow::Result { match v { - Yaml::String(s) => { + Yaml::Value(Scalar::String(s)) => { QueryStrategy::from_str(s).map_err(|_| anyhow!("invalid query strategy string")) } _ => Err(anyhow!("invalid yaml value type for query strategy")), @@ -25,7 +25,7 @@ pub fn as_query_strategy(v: &Yaml) -> anyhow::Result { pub fn as_pick_strategy(v: &Yaml) -> anyhow::Result { match v { - Yaml::String(s) => { + Yaml::Value(Scalar::String(s)) => { PickStrategy::from_str(s).map_err(|_| anyhow!("invalid pick strategy string")) } _ => Err(anyhow!("invalid yaml value type for pick strategy")), @@ -36,11 +36,11 @@ pub fn as_resolve_strategy(v: &Yaml) -> anyhow::Result { let mut config = ResolveStrategy::default(); match v { - Yaml::String(_) => { + Yaml::Value(Scalar::String(_)) => { config.query = as_query_strategy(v)?; Ok(config) } - Yaml::Hash(map) => { + Yaml::Mapping(map) => { crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { "query" => { config.query = as_query_strategy(v)?; @@ -66,7 +66,7 @@ fn add_exact_redirection_record( let domain = crate::value::as_domain(k).context("invalid resolve redirection domain")?; match v { - Yaml::String(_) => { + Yaml::Value(Scalar::String(_)) => { match crate::value::as_host(v).context(format!( "invalid resolve redirect host value for domain {domain}", ))? { @@ -75,7 +75,7 @@ fn add_exact_redirection_record( } Ok(()) } - Yaml::Array(seq) => { + Yaml::Sequence(seq) => { let mut ips = Vec::with_capacity(seq.len()); for (i, v) in seq.iter().enumerate() { let ip = crate::value::as_ipaddr(v) @@ -99,7 +99,7 @@ fn add_suffix_redirection_record( let suffix_domain = crate::value::as_domain(k).context("invalid resolve redirection domain")?; match v { - Yaml::String(_) => { + Yaml::Value(Scalar::String(_)) => { match crate::value::as_host(v).context(format!( "invalid resolve redirect host value for suffix domain {suffix_domain}", ))? { @@ -108,7 +108,7 @@ fn add_suffix_redirection_record( } Ok(()) } - Yaml::Array(seq) => { + Yaml::Sequence(seq) => { let mut ips = Vec::with_capacity(seq.len()); for (i, v) in seq.iter().enumerate() { let ip = crate::value::as_ipaddr(v).context(format!( @@ -129,21 +129,21 @@ pub fn as_resolve_redirection_builder(v: &Yaml) -> anyhow::Result { + Yaml::Mapping(map) => { for (k, v) in map { add_exact_redirection_record(&mut config, k, v)?; } Ok(config) } - Yaml::Array(seq) => { + Yaml::Sequence(seq) => { for (i, v) in seq.iter().enumerate() { - if let Yaml::Hash(map) = v { + if let Yaml::Mapping(map) = v { let to_v = crate::hash::get_required(map, RESOLVE_REDIRECTION_NODE_KEY_TO)?; crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { RESOLVE_REDIRECTION_NODE_KEY_TO => Ok(()), "exact" => { - if let Yaml::Array(values) = v { + if let Yaml::Sequence(values) = v { for (j, v) in values.iter().enumerate() { add_exact_redirection_record(&mut config, v, to_v).context( format!("invalid exact domain rule in #{i}/{k}#{j}"), @@ -156,7 +156,7 @@ pub fn as_resolve_redirection_builder(v: &Yaml) -> anyhow::Result { - if let Yaml::Array(values) = v { + if let Yaml::Sequence(values) = v { for (j, v) in values.iter().enumerate() { add_suffix_redirection_record(&mut config, v, to_v).context( format!("invalid exact domain rule in #{i}/{k}#{j}"), @@ -183,7 +183,9 @@ pub fn as_resolve_redirection_builder(v: &Yaml) -> anyhow::Result( ) -> anyhow::Result<()> { let type_name = target.type_name(); - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { let mut protocol_vs = vec![]; let mut set_default = false; @@ -33,7 +33,7 @@ fn add_alpn_matched_value( Ok(()) } "protocol" => { - if let Yaml::Array(seq) = v { + if let Yaml::Sequence(seq) = v { for (i, v) in seq.iter().enumerate() { let protocol = crate::value::as_string(v) .context(format!("invalid string value for {k}#{i}"))?; @@ -86,7 +86,7 @@ where { let mut obj = AlpnMatch::>::default(); - if let Yaml::Array(seq) = value { + if let Yaml::Sequence(seq) = value { for (i, v) in seq.iter().enumerate() { let target = T::default(); let type_name = target.type_name(); @@ -109,7 +109,7 @@ fn add_alpn_matched_backend(obj: &mut AlpnMatch, value: &Yaml) -> anyh let mut set_default = false; let mut name = NodeName::default(); - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { "set_default" => { set_default = @@ -117,7 +117,7 @@ fn add_alpn_matched_backend(obj: &mut AlpnMatch, value: &Yaml) -> anyh Ok(()) } "protocol" => { - if let Yaml::Array(seq) = v { + if let Yaml::Sequence(seq) = v { for (i, v) in seq.iter().enumerate() { let protocol = crate::value::as_string(v) .context(format!("invalid string value for {k}#{i}"))?; @@ -160,7 +160,7 @@ fn add_alpn_matched_backend(obj: &mut AlpnMatch, value: &Yaml) -> anyh pub fn as_alpn_matched_backends(value: &Yaml) -> anyhow::Result> { let mut obj = AlpnMatch::::default(); - if let Yaml::Array(seq) = value { + if let Yaml::Sequence(seq) = value { for (i, v) in seq.iter().enumerate() { add_alpn_matched_backend(&mut obj, v) .context(format!("invalid alpn matched name value for element #{i}"))?; diff --git a/lib/vey-yaml/src/value/route/host.rs b/lib/vey-yaml/src/value/route/host.rs index e01ca9656..d0449d019 100644 --- a/lib/vey-yaml/src/value/route/host.rs +++ b/lib/vey-yaml/src/value/route/host.rs @@ -7,7 +7,7 @@ use std::sync::Arc; use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::Yaml; use vey_types::net::Host; use vey_types::route::HostMatch; @@ -27,7 +27,7 @@ where { let type_name = target.type_name(); - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { let mut exact_ip_vs = vec![]; let mut exact_domain_vs = vec![]; let mut suffix_domain_vs = vec![]; @@ -48,7 +48,7 @@ where Ok(()) } "exact_match" => { - if let Yaml::Array(seq) = v { + if let Yaml::Sequence(seq) = v { for (i, v) in seq.iter().enumerate() { add_exact_host_match_value(v) .context(format!("invalid host string value for {k}#{i}"))?; @@ -60,7 +60,7 @@ where Ok(()) } "suffix_match" | "child_match" => { - if let Yaml::Array(seq) = v { + if let Yaml::Sequence(seq) = v { for (i, v) in seq.iter().enumerate() { let domain = crate::value::as_domain(v) .context(format!("invalid domain string value for {k}#{i}"))?; @@ -157,7 +157,7 @@ where { let mut obj = HostMatch::>::default(); - if let Yaml::Array(seq) = value { + if let Yaml::Sequence(seq) = value { for (i, v) in seq.iter().enumerate() { let target = T::default(); let type_name = target.type_name(); @@ -178,8 +178,10 @@ where #[cfg(test)] mod tests { use super::*; + use std::net::IpAddr; use std::str::FromStr; + use vey_types::literal_domain; // Define a test struct implementing YamlMapCallback @@ -206,7 +208,7 @@ mod tests { Ok(()) } "value" => { - self.value = value.as_i64().ok_or(anyhow!("invalid integer"))? as i32; + self.value = value.as_integer().ok_or(anyhow!("invalid integer"))? as i32; Ok(()) } _ => Err(anyhow!("unknown key: {}", key)), diff --git a/lib/vey-yaml/src/value/route/uri_path.rs b/lib/vey-yaml/src/value/route/uri_path.rs index fc1abfdff..2a0cd8879 100644 --- a/lib/vey-yaml/src/value/route/uri_path.rs +++ b/lib/vey-yaml/src/value/route/uri_path.rs @@ -7,7 +7,7 @@ use std::sync::Arc; use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::Yaml; use vey_types::route::UriPathMatch; @@ -21,7 +21,7 @@ fn add_url_path_matched_value( ) -> anyhow::Result<()> { let type_name = target.type_name(); - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { let mut prefix_match_vs = vec![]; let mut set_default = false; @@ -77,7 +77,7 @@ where { let mut obj = UriPathMatch::>::default(); - if let Yaml::Array(seq) = value { + if let Yaml::Sequence(seq) = value { for (i, v) in seq.iter().enumerate() { let target = T::default(); let type_name = target.type_name(); diff --git a/lib/vey-yaml/src/value/rustls.rs b/lib/vey-yaml/src/value/rustls.rs index fab91cbfd..d7ed7b987 100644 --- a/lib/vey-yaml/src/value/rustls.rs +++ b/lib/vey-yaml/src/value/rustls.rs @@ -9,7 +9,7 @@ use std::path::Path; use anyhow::{Context, anyhow}; use rustls_pki_types::pem::PemObject; use rustls_pki_types::{CertificateDer, PrivateKeyDer, ServerName}; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_types::net::{ RustlsCertificatePair, RustlsCertificatePairBuilder, RustlsClientConfigBuilder, @@ -17,8 +17,8 @@ use vey_types::net::{ }; pub fn as_rustls_server_name(value: &Yaml) -> anyhow::Result> { - if let Yaml::String(s) = value { - ServerName::try_from(s.as_str()) + if let Yaml::Value(Scalar::String(s)) = value { + ServerName::try_from(s.as_ref()) .map(|r| r.to_owned()) .map_err(|e| anyhow!("invalid rustls server name string: {e}")) } else { @@ -33,7 +33,7 @@ fn as_certificates_from_single_element( lookup_dir: Option<&Path>, ) -> anyhow::Result>> { let mut certs = Vec::new(); - if let Yaml::String(s) = value + if let Yaml::Value(Scalar::String(s)) = value && s.trim_start().starts_with("--") { for (i, r) in CertificateDer::pem_slice_iter(s.as_bytes()).enumerate() { @@ -63,7 +63,7 @@ pub fn as_rustls_certificates( value: &Yaml, lookup_dir: Option<&Path>, ) -> anyhow::Result>> { - if let Yaml::Array(seq) = value { + if let Yaml::Sequence(seq) = value { let mut certs = Vec::new(); for (i, v) in seq.iter().enumerate() { let this_certs = as_certificates_from_single_element(v, lookup_dir) @@ -80,7 +80,7 @@ pub fn as_rustls_private_key( value: &Yaml, lookup_dir: Option<&Path>, ) -> anyhow::Result> { - if let Yaml::String(s) = value + if let Yaml::Value(Scalar::String(s)) = value && s.trim_start().starts_with("--") { return PrivateKeyDer::from_pem_slice(s.as_bytes()) @@ -96,7 +96,7 @@ pub fn as_rustls_certificate_pair( value: &Yaml, lookup_dir: Option<&Path>, ) -> anyhow::Result { - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { let mut pair_builder = RustlsCertificatePairBuilder::default(); crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { "certificate" | "cert" => { @@ -125,7 +125,7 @@ pub fn as_rustls_client_config_builder( value: &Yaml, lookup_dir: Option<&Path>, ) -> anyhow::Result { - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { let mut builder = RustlsClientConfigBuilder::default(); let mut cert_pair_builder = RustlsCertificatePairBuilder::default(); @@ -223,13 +223,13 @@ pub fn as_rustls_server_config_builder( value: &Yaml, lookup_dir: Option<&Path>, ) -> anyhow::Result { - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { let mut builder = RustlsServerConfigBuilder::empty(); let mut cert_pair_builder = RustlsCertificatePairBuilder::default(); crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { "cert_pairs" => { - if let Yaml::Array(seq) = v { + if let Yaml::Sequence(seq) = v { for (i, v) in seq.iter().enumerate() { let pair = as_rustls_certificate_pair(v, lookup_dir) .context(format!("invalid rustls cert pair value for {k}#{i}"))?; @@ -310,11 +310,12 @@ pub fn as_rustls_server_config_builder( #[cfg(test)] mod tests { use super::*; + use saphyr::LoadableYamlNode; + use std::fs; use std::path::{Path, PathBuf}; use std::sync::atomic::{AtomicUsize, Ordering}; use std::time::Duration; - use yaml_rust::YamlLoader; const TEST_CERT_PEM: &str = include_str!("./test_data/test_cert1.pem"); const TEST_KEY_PEM: &str = include_str!("./test_data/test_key1.pem"); @@ -365,7 +366,7 @@ mod tests { #[test] fn as_rustls_server_name_err() { // non-string YAML - let yaml = Yaml::Integer(123); + let yaml = Yaml::Value(Scalar::Integer(123)); assert!(as_rustls_server_name(&yaml).is_err()); // empty string @@ -389,20 +390,17 @@ mod tests { fs::write(&cert_path, TEST_CERT_PEM).unwrap(); // single PEM string - let yaml = Yaml::String(TEST_CERT_PEM.to_string()); + let yaml = yaml_str!(TEST_CERT_PEM); let certs = as_rustls_certificates(&yaml, None).unwrap(); assert!(!certs.is_empty()); // file path - let yaml = YamlLoader::load_from_str(&format!("|-\n {}", cert_path.display())).unwrap(); + let yaml = Yaml::load_from_str(&format!("|-\n {}", cert_path.display())).unwrap(); let certs = as_rustls_certificates(&yaml[0], Some(temp_dir.path())).unwrap(); assert!(!certs.is_empty()); // array of PEM strings - let yaml = Yaml::Array(vec![ - Yaml::String(TEST_CERT_PEM.to_string()), - Yaml::String(TEST_CERT_PEM.to_string()), - ]); + let yaml = Yaml::Sequence(vec![yaml_str!(TEST_CERT_PEM), yaml_str!(TEST_CERT_PEM)]); let certs = as_rustls_certificates(&yaml, None).unwrap(); assert_eq!(certs.len(), 2); } @@ -422,10 +420,7 @@ mod tests { assert!(as_rustls_certificates(&yaml, None).is_err()); // array with invalid PEM - let yaml = Yaml::Array(vec![ - Yaml::String("invalid cert".to_string()), - Yaml::String(TEST_CERT_PEM.to_string()), - ]); + let yaml = Yaml::Sequence(vec![yaml_str!("invalid cert"), yaml_str!(TEST_CERT_PEM)]); assert!(as_rustls_certificates(&yaml, None).is_err()); // empty certificate @@ -433,11 +428,11 @@ mod tests { let test_dir_path = temp_dir.path(); let cert_path = test_dir_path.join("test_cert.pem"); fs::write(&cert_path, "").unwrap(); - let yaml = YamlLoader::load_from_str(&format!("|-\n {}", cert_path.display())).unwrap(); + let yaml = Yaml::load_from_str(&format!("|-\n {}", cert_path.display())).unwrap(); assert!(as_rustls_certificates(&yaml[0], Some(temp_dir.path())).is_err()); // non-string element in array - let yaml = Yaml::Array(vec![Yaml::Integer(123)]); + let yaml = Yaml::Sequence(vec![Yaml::Value(Scalar::Integer(123))]); assert!(as_rustls_certificates(&yaml, None).is_err()); } @@ -449,12 +444,12 @@ mod tests { fs::write(&key_path, TEST_KEY_PEM).unwrap(); // single PEM string - let yaml = Yaml::String(TEST_KEY_PEM.to_string()); + let yaml = yaml_str!(TEST_KEY_PEM); let key = as_rustls_private_key(&yaml, None).unwrap(); assert!(matches!(key, PrivateKeyDer::Pkcs8(_))); // file path - let yaml = YamlLoader::load_from_str(&format!("|-\n {}", key_path.display())).unwrap(); + let yaml = Yaml::load_from_str(&format!("|-\n {}", key_path.display())).unwrap(); let key = as_rustls_private_key(&yaml[0], Some(temp_dir.path())).unwrap(); assert!(matches!(key, PrivateKeyDer::Pkcs8(_))); } @@ -474,7 +469,7 @@ mod tests { assert!(as_rustls_private_key(&yaml, None).is_err()); // null value - let yaml = Yaml::Null; + let yaml = Yaml::Value(Scalar::Null); assert!(as_rustls_private_key(&yaml, None).is_err()); } @@ -487,7 +482,7 @@ mod tests { let key_path = test_dir_path.join("test_key.pem"); fs::write(&key_path, TEST_KEY_PEM).unwrap(); - let yaml = YamlLoader::load_from_str(&format!( + let yaml = Yaml::load_from_str(&format!( r#" certificate: |- {} @@ -510,7 +505,7 @@ mod tests { #[test] fn as_rustls_certificate_pair_err() { // non-map YAML - let yaml = Yaml::Integer(123); + let yaml = Yaml::Value(Scalar::Integer(123)); assert!(as_rustls_certificate_pair(&yaml, None).is_err()); let yaml = yaml_str!("invalid"); @@ -526,7 +521,7 @@ mod tests { certificate: "invalid cert" "# ); - assert!(as_rustls_certificate_pair(&yaml[0], None).is_err()); + assert!(as_rustls_certificate_pair(&yaml, None).is_err()); // invalid private key let yaml = yaml_doc!( @@ -534,7 +529,7 @@ mod tests { private_key: "invalid key" "# ); - assert!(as_rustls_certificate_pair(&yaml[0], None).is_err()); + assert!(as_rustls_certificate_pair(&yaml, None).is_err()); // unknown key let yaml = yaml_doc!( @@ -542,7 +537,7 @@ mod tests { unknown_key: "value" "# ); - assert!(as_rustls_certificate_pair(&yaml[0], None).is_err()); + assert!(as_rustls_certificate_pair(&yaml, None).is_err()); } #[test] @@ -553,7 +548,7 @@ mod tests { fs::write(&cert_path, TEST_CERT_PEM).unwrap(); let key_path = test_dir_path.join("test_key.pem"); fs::write(&key_path, TEST_KEY_PEM).unwrap(); - let yaml = YamlLoader::load_from_str(&format!( + let yaml = Yaml::load_from_str(&format!( r#" cert: |- {} @@ -567,7 +562,7 @@ mod tests { let cert_pair1 = as_rustls_certificate_pair(&yaml[0], Some(test_dir_path)).unwrap(); let cert_pair2 = as_rustls_certificate_pair(&yaml[0], Some(test_dir_path)).unwrap(); - let yaml = YamlLoader::load_from_str(&format!( + let yaml = Yaml::load_from_str(&format!( r#" no_session_cache: true disable_sni: true @@ -601,7 +596,7 @@ mod tests { assert_eq!(builder, expected); // cert_pair field - let yaml = YamlLoader::load_from_str(&format!( + let yaml = Yaml::load_from_str(&format!( r#" cert_pair: certificate: |- @@ -622,7 +617,7 @@ mod tests { #[test] fn as_rustls_client_config_builder_err() { // non-map YAML - let yaml = Yaml::Integer(123); + let yaml = Yaml::Value(Scalar::Integer(123)); assert!(as_rustls_client_config_builder(&yaml, None).is_err()); let yaml = yaml_str!("invalid"); @@ -630,11 +625,11 @@ mod tests { // invalid boolean value let yaml = yaml_doc!(r#"no_session_cache: "not_a_bool""#); - assert!(as_rustls_client_config_builder(&yaml[0], None).is_err()); + assert!(as_rustls_client_config_builder(&yaml, None).is_err()); // invalid max_fragment_size let yaml = yaml_doc!(r#"max_fragment_size: "invalid""#); - assert!(as_rustls_client_config_builder(&yaml[0], None).is_err()); + assert!(as_rustls_client_config_builder(&yaml, None).is_err()); // duplicate certificate config let temp_dir = TempDir::new("rustls_client_config_builder_err"); @@ -643,7 +638,7 @@ mod tests { fs::write(&cert_path, TEST_CERT_PEM).unwrap(); let key_path = test_dir_path.join("test_key.pem"); fs::write(&key_path, TEST_KEY_PEM).unwrap(); - let yaml = YamlLoader::load_from_str(&format!( + let yaml = Yaml::load_from_str(&format!( r#" cert: |- {} @@ -669,7 +664,7 @@ mod tests { unknown_key: "value" "# ); - assert!(as_rustls_client_config_builder(&yaml[0], None).is_err()); + assert!(as_rustls_client_config_builder(&yaml, None).is_err()); } #[test] @@ -680,7 +675,7 @@ mod tests { fs::write(&cert_path, TEST_CERT_PEM).unwrap(); let key_path = test_dir_path.join("test_key.pem"); fs::write(&key_path, TEST_KEY_PEM).unwrap(); - let yaml = YamlLoader::load_from_str(&format!( + let yaml = Yaml::load_from_str(&format!( r#" cert: |- {} @@ -695,7 +690,7 @@ mod tests { let cert_pair2 = as_rustls_certificate_pair(&yaml[0], Some(test_dir_path)).unwrap(); let cert_pair3 = as_rustls_certificate_pair(&yaml[0], Some(test_dir_path)).unwrap(); - let yaml = YamlLoader::load_from_str(&format!( + let yaml = Yaml::load_from_str(&format!( r#" cert_pairs: - certificate: |- @@ -726,7 +721,7 @@ mod tests { assert_eq!(builder, expected); // cert_pair without array - let yaml = YamlLoader::load_from_str(&format!( + let yaml = Yaml::load_from_str(&format!( r#" cert_pairs: certificate: |- @@ -746,7 +741,7 @@ mod tests { assert_eq!(builder, expected); // certificate and private_key fields - let yaml = YamlLoader::load_from_str(&format!( + let yaml = Yaml::load_from_str(&format!( r#" certificate: |- {} @@ -766,7 +761,7 @@ mod tests { #[test] fn as_rustls_server_config_builder_err() { // non-map YAML - let yaml = Yaml::Integer(123); + let yaml = Yaml::Value(Scalar::Integer(123)); assert!(as_rustls_server_config_builder(&yaml, None).is_err()); let yaml = yaml_str!("invalid"); @@ -783,7 +778,7 @@ mod tests { - invalid "# ); - assert!(as_rustls_server_config_builder(&yaml[0], None).is_err()); + assert!(as_rustls_server_config_builder(&yaml, None).is_err()); // invalid boolean value let yaml = yaml_doc!( @@ -791,7 +786,7 @@ mod tests { no_session_cache: "not_a_bool" "# ); - assert!(as_rustls_server_config_builder(&yaml[0], None).is_err()); + assert!(as_rustls_server_config_builder(&yaml, None).is_err()); // unknown key let yaml = yaml_doc!( @@ -799,6 +794,6 @@ mod tests { unknown_key: "value" "# ); - assert!(as_rustls_server_config_builder(&yaml[0], None).is_err()); + assert!(as_rustls_server_config_builder(&yaml, None).is_err()); } } diff --git a/lib/vey-yaml/src/value/sched.rs b/lib/vey-yaml/src/value/sched.rs index 78b42c87d..f2f460efa 100644 --- a/lib/vey-yaml/src/value/sched.rs +++ b/lib/vey-yaml/src/value/sched.rs @@ -4,16 +4,16 @@ */ use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_compat::CpuAffinity; fn cpu_affinity_add_value(set: &mut CpuAffinity, v: &Yaml) -> anyhow::Result<()> { match v { - Yaml::String(s) => set + Yaml::Value(Scalar::String(s)) => set .parse_add(s) .map_err(|e| anyhow!("invalid CPU ID(s) string value {s}: {e}")), - Yaml::Integer(i) => { + Yaml::Value(Scalar::Integer(i)) => { let n = usize::try_from(*i) .map_err(|e| anyhow!("invalid CPU ID integer value {}: {e}", *i))?; set.add_id(n) @@ -26,7 +26,7 @@ fn cpu_affinity_add_value(set: &mut CpuAffinity, v: &Yaml) -> anyhow::Result<()> pub fn as_cpu_set(v: &Yaml) -> anyhow::Result { let mut set = CpuAffinity::default(); - if let Yaml::Array(seq) = v { + if let Yaml::Sequence(seq) = v { for (i, v) in seq.iter().enumerate() { cpu_affinity_add_value(&mut set, v) .context(format!("invalid CPU ID list value for #{i}"))?; @@ -58,7 +58,7 @@ mod tests { let yaml = yaml_str!("3"); assert_eq!(as_cpu_set(&yaml).unwrap().cpu_id_list(), &[3]); - let yaml = Yaml::Integer(5); + let yaml = Yaml::Value(Scalar::Integer(5)); assert_eq!(as_cpu_set(&yaml).unwrap().cpu_id_list(), &[5]); // valid range of CPU IDs @@ -78,7 +78,7 @@ mod tests { assert!(as_cpu_set(&yaml).is_err()); // invalid integer value - let yaml = Yaml::Integer(-1); + let yaml = Yaml::Value(Scalar::Integer(-1)); assert!(as_cpu_set(&yaml).is_err()); // invalid array value @@ -91,7 +91,7 @@ mod tests { assert!(as_cpu_set(&yaml).is_err()); // invalid type - let yaml = Yaml::Boolean(true); + let yaml = Yaml::Value(Scalar::Boolean(true)); assert!(as_cpu_set(&yaml).is_err()); } } diff --git a/lib/vey-yaml/src/value/speed_limit.rs b/lib/vey-yaml/src/value/speed_limit.rs index f80dfa503..278f42253 100644 --- a/lib/vey-yaml/src/value/speed_limit.rs +++ b/lib/vey-yaml/src/value/speed_limit.rs @@ -4,7 +4,7 @@ */ use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::Yaml; use vey_types::limit::{GlobalDatagramSpeedLimitConfig, GlobalStreamSpeedLimitConfig}; use vey_types::net::{TcpSockSpeedLimitConfig, UdpSockSpeedLimitConfig}; @@ -12,13 +12,13 @@ use vey_types::net::{TcpSockSpeedLimitConfig, UdpSockSpeedLimitConfig}; pub fn as_tcp_sock_speed_limit(v: &Yaml) -> anyhow::Result { let mut config = TcpSockSpeedLimitConfig::default(); match v { - Yaml::String(_) | Yaml::Integer(_) => { + Yaml::Value(_) => { let limit = crate::humanize::as_usize(v).context("invalid humanize usize value")?; config.shift_millis = vey_types::net::RATE_LIMIT_SHIFT_MILLIS_DEFAULT; config.max_north = limit; config.max_south = limit; } - Yaml::Hash(map) => { + Yaml::Mapping(map) => { crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { "shift" | "shift_millis" => { config.shift_millis = @@ -47,13 +47,13 @@ pub fn as_tcp_sock_speed_limit(v: &Yaml) -> anyhow::Result anyhow::Result { let mut config = UdpSockSpeedLimitConfig::default(); match v { - Yaml::String(_) | Yaml::Integer(_) => { + Yaml::Value(_) => { let limit = crate::humanize::as_usize(v).context("invalid humanize usize value")?; config.shift_millis = vey_types::net::RATE_LIMIT_SHIFT_MILLIS_DEFAULT; config.max_north_bytes = limit; config.max_south_bytes = limit; } - Yaml::Hash(map) => { + Yaml::Mapping(map) => { crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { "shift" | "shift_millis" => { config.shift_millis = @@ -91,11 +91,11 @@ pub fn as_udp_sock_speed_limit(v: &Yaml) -> anyhow::Result anyhow::Result { match v { - Yaml::String(_) | Yaml::Integer(_) => { + Yaml::Value(_) => { let limit = crate::humanize::as_u64(v).context("invalid humanize u64 value")?; Ok(GlobalStreamSpeedLimitConfig::per_second(limit)) } - Yaml::Hash(map) => { + Yaml::Mapping(map) => { let mut config = GlobalStreamSpeedLimitConfig::default(); crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { "replenish_interval" => { @@ -127,11 +127,11 @@ pub fn as_global_stream_speed_limit(v: &Yaml) -> anyhow::Result anyhow::Result { match v { - Yaml::String(_) | Yaml::Integer(_) => { + Yaml::Value(_) => { let limit = crate::humanize::as_u64(v).context("invalid humanize u64 value")?; Ok(GlobalDatagramSpeedLimitConfig::per_second(limit)) } - Yaml::Hash(map) => { + Yaml::Mapping(map) => { let mut config = GlobalDatagramSpeedLimitConfig::default(); crate::foreach_kv(map, |k, v| match crate::key::normalize(k).as_str() { "replenish_interval" => { @@ -176,6 +176,7 @@ pub fn as_global_datagram_speed_limit(v: &Yaml) -> anyhow::Result anyhow::Result<()> { } pub(super) fn parse_config(value: &Yaml) -> anyhow::Result { - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { let mut no_append_ca_cert = false; let mut ca_cert_pem = Vec::new(); let mut ca_cert: Option = None; @@ -130,6 +130,8 @@ pub(super) fn parse_config(value: &Yaml) -> anyhow::Result mod tests { use std::time::Duration; + use saphyr::Scalar; + use vey_histogram::HistogramMetricsConfig; use super::*; @@ -149,7 +151,7 @@ mod tests { #[test] fn parse_rejects_non_map() { - match parse_config(&Yaml::Integer(1)) { + match parse_config(&Yaml::Value(Scalar::Integer(1))) { Err(err) => assert!(err.to_string().contains("map")), Ok(_) => panic!("non-map issuer config was accepted"), } diff --git a/vey-dcgen/src/config/mod.rs b/vey-dcgen/src/config/mod.rs index 2a768c997..46c4bd00d 100644 --- a/vey-dcgen/src/config/mod.rs +++ b/vey-dcgen/src/config/mod.rs @@ -8,7 +8,7 @@ use std::path::Path; use std::sync::Mutex; use anyhow::anyhow; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; mod issuer; pub(crate) use issuer::{OpensslIssuerConfig, get_config as get_issuer_config}; @@ -23,7 +23,7 @@ pub fn load(program_name: &str) -> anyhow::Result<&'static Path> { // allow multiple docs, and treat them as the same vey_yaml::foreach_doc(config_file, |_, doc| match doc { - Yaml::Hash(map) => load_doc(map, program_name), + Yaml::Mapping(map) => load_doc(map, program_name), _ => Err(anyhow!("yaml doc root should be hash")), })?; @@ -54,7 +54,7 @@ fn reload_blocking() -> anyhow::Result<()> { RELOAD_ISSUER.lock().unwrap().take(); if let Some(config_file) = vey_daemon::opts::config_file() { vey_yaml::foreach_doc(config_file, |_, doc| match doc { - Yaml::Hash(map) => reload_doc(map), + Yaml::Mapping(map) => reload_doc(map), _ => Err(anyhow!("yaml doc root should be hash")), })?; } @@ -68,7 +68,7 @@ fn reload_issuer_blocking() -> anyhow::Result<()> { RELOAD_ISSUER.lock().unwrap().take(); if let Some(config_file) = vey_daemon::opts::config_file() { vey_yaml::foreach_doc(config_file, |_, doc| match doc { - Yaml::Hash(map) => reload_issuer_doc(map), + Yaml::Mapping(map) => reload_issuer_doc(map), _ => Err(anyhow!("yaml doc root should be hash")), })?; } @@ -87,7 +87,7 @@ fn stash_issuer(value: &Yaml) -> anyhow::Result<()> { Ok(()) } -fn reload_issuer_doc(map: &yaml::Hash) -> anyhow::Result<()> { +fn reload_issuer_doc(map: &saphyr::Mapping) -> anyhow::Result<()> { vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { "issuer" => stash_issuer(v), _ => Ok(()), @@ -95,7 +95,7 @@ fn reload_issuer_doc(map: &yaml::Hash) -> anyhow::Result<()> { Ok(()) } -fn reload_doc(map: &yaml::Hash) -> anyhow::Result<()> { +fn reload_doc(map: &saphyr::Mapping) -> anyhow::Result<()> { vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { "runtime" | "worker" | "stat" | "controller" => Ok(()), "issuer" => stash_issuer(v), @@ -105,7 +105,7 @@ fn reload_doc(map: &yaml::Hash) -> anyhow::Result<()> { Ok(()) } -fn load_doc(map: &yaml::Hash, program_name: &str) -> anyhow::Result<()> { +fn load_doc(map: &saphyr::Mapping, program_name: &str) -> anyhow::Result<()> { vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { "runtime" => vey_daemon::runtime::config::load(v), "worker" => vey_daemon::runtime::config::load_worker(v), diff --git a/vey-dcgen/src/config/server/dummy.rs b/vey-dcgen/src/config/server/dummy.rs index 481f2bfa6..17ec18071 100644 --- a/vey-dcgen/src/config/server/dummy.rs +++ b/vey-dcgen/src/config/server/dummy.rs @@ -4,7 +4,7 @@ */ use anyhow::anyhow; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::NodeName; @@ -20,7 +20,7 @@ impl DummyServerConfig { DummyServerConfig { name: name.clone() } } - pub(super) fn parse(map: &yaml::Hash) -> anyhow::Result { + pub(super) fn parse(map: &saphyr::Mapping) -> anyhow::Result { let mut server = DummyServerConfig { name: NodeName::default(), }; diff --git a/vey-dcgen/src/config/server/mod.rs b/vey-dcgen/src/config/server/mod.rs index 7383d1895..bac0b0a40 100644 --- a/vey-dcgen/src/config/server/mod.rs +++ b/vey-dcgen/src/config/server/mod.rs @@ -4,7 +4,7 @@ */ use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_macros::AnyConfig; use vey_types::metrics::NodeName; @@ -62,7 +62,7 @@ pub(crate) fn load_all(v: &Yaml) -> anyhow::Result<()> { Ok(()) } -fn load_server(map: &yaml::Hash) -> anyhow::Result { +fn load_server(map: &saphyr::Mapping) -> anyhow::Result { let server_type = vey_yaml::hash_get_required_str(map, CONFIG_KEY_SERVER_TYPE)?; match vey_yaml::key::normalize(server_type).as_str() { "dummy" => { diff --git a/vey-dcgen/src/config/server/udp.rs b/vey-dcgen/src/config/server/udp.rs index 25714447e..2bd3b09cd 100644 --- a/vey-dcgen/src/config/server/udp.rs +++ b/vey-dcgen/src/config/server/udp.rs @@ -4,7 +4,7 @@ */ use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::NodeName; use vey_types::net::UdpListenConfig; @@ -25,7 +25,7 @@ impl UdpServerConfig { } } - pub(super) fn parse(map: &yaml::Hash) -> anyhow::Result { + pub(super) fn parse(map: &saphyr::Mapping) -> anyhow::Result { let mut server = UdpServerConfig::new(); vey_yaml::foreach_kv(map, |k, v| server.set(k, v))?; server.check()?; @@ -78,10 +78,11 @@ impl ServerConfig for UdpServerConfig { mod tests { use super::super::ServerConfig; use super::*; + use saphyr::LoadableYamlNode; fn parse(text: &str) -> anyhow::Result { - let docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); - let Yaml::Hash(map) = &docs[0] else { + let docs = Yaml::load_from_str(text).unwrap(); + let Yaml::Mapping(map) = &docs[0] else { panic!("yaml root should be a map"); }; UdpServerConfig::parse(map) diff --git a/vey-dcgen/src/config/server/unix.rs b/vey-dcgen/src/config/server/unix.rs index 1a9de9a92..e4dfa77ad 100644 --- a/vey-dcgen/src/config/server/unix.rs +++ b/vey-dcgen/src/config/server/unix.rs @@ -6,7 +6,7 @@ use std::path::PathBuf; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::NodeName; @@ -26,7 +26,7 @@ impl UnixServerConfig { } } - pub(super) fn parse(map: &yaml::Hash) -> anyhow::Result { + pub(super) fn parse(map: &saphyr::Mapping) -> anyhow::Result { let mut server = UnixServerConfig::new(); vey_yaml::foreach_kv(map, |k, v| server.set(k, v))?; server.check()?; @@ -81,10 +81,11 @@ impl ServerConfig for UnixServerConfig { mod tests { use super::super::ServerConfig; use super::*; + use saphyr::LoadableYamlNode; fn parse(text: &str) -> anyhow::Result { - let docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); - let Yaml::Hash(map) = &docs[0] else { + let docs = Yaml::load_from_str(text).unwrap(); + let Yaml::Mapping(map) = &docs[0] else { panic!("yaml root should be a map"); }; UnixServerConfig::parse(map) diff --git a/vey-gateway/Cargo.toml b/vey-gateway/Cargo.toml index 9e905ed70..709341666 100644 --- a/vey-gateway/Cargo.toml +++ b/vey-gateway/Cargo.toml @@ -12,7 +12,7 @@ description = "Programmable reverse proxy and gateway" anyhow.workspace = true thiserror.workspace = true async-trait.workspace = true -yaml-rust.workspace = true +saphyr.workspace = true serde_json.workspace = true log = { workspace = true, features = ["max_level_trace", "release_max_level_debug"] } slog = { workspace = true, features = ["max_level_trace", "release_max_level_debug"] } diff --git a/vey-gateway/src/config/backend/dummy_close.rs b/vey-gateway/src/config/backend/dummy_close.rs index 42c64e5f3..8ff88dfcc 100644 --- a/vey-gateway/src/config/backend/dummy_close.rs +++ b/vey-gateway/src/config/backend/dummy_close.rs @@ -4,7 +4,7 @@ */ use anyhow::anyhow; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::NodeName; use vey_yaml::YamlDocPosition; @@ -28,7 +28,7 @@ impl DummyCloseBackendConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut server = DummyCloseBackendConfig { diff --git a/vey-gateway/src/config/backend/keyless_quic.rs b/vey-gateway/src/config/backend/keyless_quic.rs index 65c7603c3..ff7d69b52 100644 --- a/vey-gateway/src/config/backend/keyless_quic.rs +++ b/vey-gateway/src/config/backend/keyless_quic.rs @@ -7,7 +7,7 @@ use std::sync::Arc; use std::time::Duration; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_histogram::HistogramMetricsConfig; use vey_types::metrics::{MetricTagMap, NodeName}; @@ -67,7 +67,7 @@ impl KeylessQuicBackendConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut site = KeylessQuicBackendConfig::new(position); @@ -104,7 +104,7 @@ impl KeylessQuicBackendConfig { Ok(()) } "discover_data" => { - self.discover_data = DiscoverRegisterData::Yaml(v.clone()); + self.discover_data = DiscoverRegisterData::from_yaml(v); Ok(()) } "extra_metrics_tags" => { diff --git a/vey-gateway/src/config/backend/keyless_tcp.rs b/vey-gateway/src/config/backend/keyless_tcp.rs index e5612ad99..994e325dc 100644 --- a/vey-gateway/src/config/backend/keyless_tcp.rs +++ b/vey-gateway/src/config/backend/keyless_tcp.rs @@ -8,7 +8,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use rustls_pki_types::ServerName; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_histogram::HistogramMetricsConfig; use vey_types::metrics::{MetricTagMap, NodeName}; @@ -61,7 +61,7 @@ impl KeylessTcpBackendConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut site = KeylessTcpBackendConfig::new(position); @@ -95,7 +95,7 @@ impl KeylessTcpBackendConfig { Ok(()) } "discover_data" => { - self.discover_data = DiscoverRegisterData::Yaml(v.clone()); + self.discover_data = DiscoverRegisterData::from_yaml(v); Ok(()) } "extra_metrics_tags" => { diff --git a/vey-gateway/src/config/backend/mod.rs b/vey-gateway/src/config/backend/mod.rs index c6375aed8..8ec6090bf 100644 --- a/vey-gateway/src/config/backend/mod.rs +++ b/vey-gateway/src/config/backend/mod.rs @@ -6,7 +6,7 @@ use std::path::Path; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_macros::AnyConfig; use vey_types::metrics::NodeName; @@ -65,7 +65,7 @@ pub(crate) fn load_all(v: &Yaml, conf_dir: &Path) -> anyhow::Result<()> { pub(crate) fn load_at_position(position: &YamlDocPosition) -> anyhow::Result { let doc = vey_yaml::load_doc(position)?; - if let Yaml::Hash(map) = doc { + if let Yaml::Mapping(map) = doc { let backend = load_backend(&map, Some(position.clone()))?; registry::add(backend.clone(), true)?; Ok(backend) @@ -75,7 +75,7 @@ pub(crate) fn load_at_position(position: &YamlDocPosition) -> anyhow::Result, ) -> anyhow::Result { let backend_type = vey_yaml::hash_get_required_str(map, CONFIG_KEY_BACKEND_TYPE)?; diff --git a/vey-gateway/src/config/backend/stream_tcp.rs b/vey-gateway/src/config/backend/stream_tcp.rs index aea89e70f..adba75a67 100644 --- a/vey-gateway/src/config/backend/stream_tcp.rs +++ b/vey-gateway/src/config/backend/stream_tcp.rs @@ -6,7 +6,7 @@ use std::sync::Arc; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_histogram::HistogramMetricsConfig; use vey_types::collection::SelectivePickPolicy; @@ -43,7 +43,7 @@ impl StreamTcpBackendConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut connector = StreamTcpBackendConfig::new(position); @@ -77,7 +77,7 @@ impl StreamTcpBackendConfig { Ok(()) } "discover_data" => { - self.discover_data = DiscoverRegisterData::Yaml(v.clone()); + self.discover_data = DiscoverRegisterData::from_yaml(v); Ok(()) } "peer_pick_policy" => { diff --git a/vey-gateway/src/config/discover/host_resolver/yaml.rs b/vey-gateway/src/config/discover/host_resolver/yaml.rs index ef3d2462d..136cf7d7b 100644 --- a/vey-gateway/src/config/discover/host_resolver/yaml.rs +++ b/vey-gateway/src/config/discover/host_resolver/yaml.rs @@ -4,7 +4,7 @@ */ use anyhow::anyhow; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_yaml::YamlDocPosition; @@ -12,7 +12,7 @@ use super::{HostResolverDiscoverConfig, HostResolverDiscoverInput}; impl HostResolverDiscoverConfig { pub(crate) fn parse_yaml_conf( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut site = HostResolverDiscoverConfig::new(position); diff --git a/vey-gateway/src/config/discover/mod.rs b/vey-gateway/src/config/discover/mod.rs index 16a4635ca..022ac6f18 100644 --- a/vey-gateway/src/config/discover/mod.rs +++ b/vey-gateway/src/config/discover/mod.rs @@ -3,10 +3,11 @@ * SPDX-FileCopyrightText: 2024-2025 ByteDance and/or its affiliates. */ +use std::borrow::Cow; use std::path::Path; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::{Mapping, Scalar, Yaml}; use vey_macros::AnyConfig; use vey_types::metrics::NodeName; @@ -24,11 +25,46 @@ const CONFIG_KEY_DISCOVER_NAME: &str = "name"; #[derive(Clone, Debug, PartialEq, Eq)] pub(crate) enum DiscoverRegisterData { Null, - Yaml(Yaml), + Yaml(Yaml<'static>), #[allow(unused)] Json(serde_json::Value), } +impl DiscoverRegisterData { + pub(crate) fn from_yaml(value: &Yaml<'_>) -> Self { + Self::Yaml(yaml_to_static(value)) + } +} + +fn yaml_to_static(value: &Yaml<'_>) -> Yaml<'static> { + match value { + Yaml::Value(Scalar::Null) => Yaml::Value(Scalar::Null), + Yaml::Value(Scalar::Boolean(b)) => Yaml::Value(Scalar::Boolean(*b)), + Yaml::Value(Scalar::Integer(i)) => Yaml::Value(Scalar::Integer(*i)), + Yaml::Value(Scalar::FloatingPoint(n)) => Yaml::Value(Scalar::FloatingPoint(*n)), + Yaml::Value(Scalar::String(s)) => Yaml::Value(Scalar::String(Cow::Owned(s.to_string()))), + Yaml::Sequence(seq) => Yaml::Sequence(seq.iter().map(yaml_to_static).collect()), + Yaml::Mapping(map) => { + let mut out = Mapping::new(); + for (k, v) in map { + out.insert(yaml_to_static(k), yaml_to_static(v)); + } + Yaml::Mapping(out) + } + Yaml::Tagged(tag, node) => Yaml::Tagged( + Cow::Owned(tag.clone().into_owned()), + Box::new(yaml_to_static(node)), + ), + Yaml::Representation(repr, style, tag) => Yaml::Representation( + Cow::Owned(repr.to_string()), + *style, + tag.as_ref().map(|t| Cow::Owned(t.clone().into_owned())), + ), + Yaml::Alias(id) => Yaml::Alias(*id), + Yaml::BadValue => Yaml::BadValue, + } +} + pub(crate) enum DiscoverConfigDiffAction { NoAction, SpawnNew, @@ -66,7 +102,7 @@ pub(crate) fn load_all(v: &Yaml, conf_dir: &Path) -> anyhow::Result<()> { pub(crate) fn load_at_position(position: &YamlDocPosition) -> anyhow::Result { let doc = vey_yaml::load_doc(position)?; - if let Yaml::Hash(map) = doc { + if let Yaml::Mapping(map) = doc { let site = load_discover(&map, Some(position.clone()))?; registry::add(site.clone(), true)?; Ok(site) @@ -76,7 +112,7 @@ pub(crate) fn load_at_position(position: &YamlDocPosition) -> anyhow::Result, ) -> anyhow::Result { let discover_type = vey_yaml::hash_get_required_str(map, CONFIG_KEY_DISCOVER_TYPE)?; diff --git a/vey-gateway/src/config/discover/static_addr/yaml.rs b/vey-gateway/src/config/discover/static_addr/yaml.rs index 287494d23..59cb73166 100644 --- a/vey-gateway/src/config/discover/static_addr/yaml.rs +++ b/vey-gateway/src/config/discover/static_addr/yaml.rs @@ -4,7 +4,7 @@ */ use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_yaml::YamlDocPosition; @@ -12,7 +12,7 @@ use super::{StaticAddrDiscoverConfig, StaticAddrDiscoverInput}; impl StaticAddrDiscoverConfig { pub(crate) fn parse_yaml_conf( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut site = StaticAddrDiscoverConfig::new(position); @@ -35,7 +35,7 @@ impl StaticAddrDiscoverConfig { pub(crate) fn parse_yaml_data(&self, input: &Yaml) -> anyhow::Result { let mut parsed = StaticAddrDiscoverInput::default(); match input { - Yaml::Array(seq) => { + Yaml::Sequence(seq) => { for (i, v) in seq.iter().enumerate() { let data = vey_yaml::value::as_weighted_sockaddr(v) .context(format!("invalid weighted socket address value for #{i}"))?; diff --git a/vey-gateway/src/config/log.rs b/vey-gateway/src/config/log.rs index 7294e6192..ed6f0592a 100644 --- a/vey-gateway/src/config/log.rs +++ b/vey-gateway/src/config/log.rs @@ -8,7 +8,7 @@ use std::path::Path; use std::sync::OnceLock; use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_daemon::log::LogConfig; @@ -17,11 +17,11 @@ static TASK_DEFAULT_LOG_CONFIG_CONTAINER: OnceLock = OnceLock::new(); pub(crate) fn load(v: &Yaml, conf_dir: &Path, program_name: &str) -> anyhow::Result<()> { let mut default_log_config: Option = None; match v { - Yaml::String(s) => { + Yaml::Value(Scalar::String(s)) => { let config = LogConfig::with_driver_name(s, program_name)?; default_log_config = Some(config); } - Yaml::Hash(map) => { + Yaml::Mapping(map) => { vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { "default" => { let config = LogConfig::parse_yaml(v, conf_dir, program_name) @@ -51,7 +51,7 @@ pub(crate) fn load(v: &Yaml, conf_dir: &Path, program_name: &str) -> anyhow::Res _ => Err(anyhow!("invalid key {k}")), })?; } - Yaml::Null => return Ok(()), + Yaml::Value(Scalar::Null) => return Ok(()), _ => return Err(anyhow!("invalid value type")), } if let Some(config) = default_log_config { diff --git a/vey-gateway/src/config/mod.rs b/vey-gateway/src/config/mod.rs index 6e7761d36..208eea909 100644 --- a/vey-gateway/src/config/mod.rs +++ b/vey-gateway/src/config/mod.rs @@ -7,7 +7,7 @@ use std::path::Path; use anyhow::anyhow; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; pub(crate) mod log; @@ -21,7 +21,7 @@ pub fn load(program_name: &str) -> anyhow::Result<&'static Path> { // allow multiple docs, and treat them as the same vey_yaml::foreach_doc(config_file, |_, doc| match doc { - Yaml::Hash(map) => load_doc(map, program_name), + Yaml::Mapping(map) => load_doc(map, program_name), _ => Err(anyhow!("yaml doc root should be hash")), })?; @@ -45,14 +45,14 @@ fn reload_blocking() -> anyhow::Result<()> { if let Some(conf_file) = vey_daemon::opts::config_file() { // allow multiple docs, and treat them as the same vey_yaml::foreach_doc(conf_file, |_, doc| match doc { - Yaml::Hash(map) => reload_doc(map), + Yaml::Mapping(map) => reload_doc(map), _ => Err(anyhow!("yaml doc root should be hash")), })?; } Ok(()) } -fn reload_doc(map: &yaml::Hash) -> anyhow::Result<()> { +fn reload_doc(map: &saphyr::Mapping) -> anyhow::Result<()> { let conf_dir = vey_daemon::opts::config_dir() .ok_or_else(|| anyhow!("no valid config dir has been set"))?; vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { @@ -65,7 +65,7 @@ fn reload_doc(map: &yaml::Hash) -> anyhow::Result<()> { Ok(()) } -fn load_doc(map: &yaml::Hash, program_name: &str) -> anyhow::Result<()> { +fn load_doc(map: &saphyr::Mapping, program_name: &str) -> anyhow::Result<()> { let conf_dir = vey_daemon::opts::config_dir() .ok_or_else(|| anyhow!("no valid config dir has been set"))?; vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { diff --git a/vey-gateway/src/config/server/dummy_close.rs b/vey-gateway/src/config/server/dummy_close.rs index fbb04ec59..efcc75d2b 100644 --- a/vey-gateway/src/config/server/dummy_close.rs +++ b/vey-gateway/src/config/server/dummy_close.rs @@ -4,7 +4,7 @@ */ use anyhow::anyhow; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::NodeName; use vey_yaml::YamlDocPosition; @@ -29,7 +29,7 @@ impl DummyCloseServerConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut server = DummyCloseServerConfig { diff --git a/vey-gateway/src/config/server/keyless_proxy.rs b/vey-gateway/src/config/server/keyless_proxy.rs index 528fa2c9b..1bdea2fa7 100644 --- a/vey-gateway/src/config/server/keyless_proxy.rs +++ b/vey-gateway/src/config/server/keyless_proxy.rs @@ -9,7 +9,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use ascii::AsciiString; use log::warn; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::acl::AclNetworkRuleBuilder; use vey_types::metrics::{MetricTagMap, NodeName}; @@ -52,7 +52,7 @@ impl KeylessProxyServerConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut server = KeylessProxyServerConfig::new(position); diff --git a/vey-gateway/src/config/server/mod.rs b/vey-gateway/src/config/server/mod.rs index 85ec9caa6..eb4116889 100644 --- a/vey-gateway/src/config/server/mod.rs +++ b/vey-gateway/src/config/server/mod.rs @@ -9,8 +9,8 @@ use std::sync::Arc; use std::time::Duration; use anyhow::{Context, anyhow}; +use saphyr::Yaml; use slog::Logger; -use yaml_rust::{Yaml, yaml}; use vey_daemon::config::TopoMap; use vey_macros::AnyConfig; @@ -103,7 +103,7 @@ pub(crate) fn load_all(v: &Yaml, conf_dir: &Path) -> anyhow::Result<()> { pub(crate) fn load_at_position(position: &YamlDocPosition) -> anyhow::Result { let doc = vey_yaml::load_doc(position)?; - if let Yaml::Hash(map) = doc { + if let Yaml::Mapping(map) = doc { let server = load_server(&map, Some(position.clone()))?; let old_server = registry::add(server.clone()); if let Err(e) = build_topology_map() { @@ -124,7 +124,7 @@ pub(crate) fn load_at_position(position: &YamlDocPosition) -> anyhow::Result, ) -> anyhow::Result { let server_type = vey_yaml::hash_get_required_str(map, CONFIG_KEY_SERVER_TYPE)?; diff --git a/vey-gateway/src/config/server/openssl_proxy/host.rs b/vey-gateway/src/config/server/openssl_proxy/host.rs index 2eeb246a9..c5d4020f0 100644 --- a/vey-gateway/src/config/server/openssl_proxy/host.rs +++ b/vey-gateway/src/config/server/openssl_proxy/host.rs @@ -15,11 +15,13 @@ use openssl::ssl::{ use openssl::stack::Stack; use openssl::x509::X509; use openssl::x509::store::X509StoreBuilder; -use yaml_rust::Yaml; +use saphyr::Yaml; use vey_types::collection::NamedValue; use vey_types::limit::RateLimitQuota; use vey_types::metrics::NodeName; +#[cfg(tongsuo)] +use vey_types::net::OpensslTlcpCertificatePair; use vey_types::net::{ OpensslCertificatePair, OpensslServerSessionCache, OpensslSessionIdContext, OpensslTicketKey, RollingTicketer, TcpSockSpeedLimitConfig, @@ -27,9 +29,6 @@ use vey_types::net::{ use vey_types::route::AlpnMatch; use vey_yaml::{YamlDocPosition, YamlMapCallback}; -#[cfg(tongsuo)] -use vey_types::net::OpensslTlcpCertificatePair; - #[derive(Clone, Debug, Default, PartialEq)] pub(crate) struct OpensslHostConfig { name: String, diff --git a/vey-gateway/src/config/server/openssl_proxy/mod.rs b/vey-gateway/src/config/server/openssl_proxy/mod.rs index 33e617558..39a87f49a 100644 --- a/vey-gateway/src/config/server/openssl_proxy/mod.rs +++ b/vey-gateway/src/config/server/openssl_proxy/mod.rs @@ -10,7 +10,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use ascii::AsciiString; use log::warn; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_io_ext::StreamCopyConfig; use vey_tls_ticket::TlsTicketConfig; @@ -88,7 +88,7 @@ impl OpensslProxyServerConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut server = OpensslProxyServerConfig::new(position); diff --git a/vey-gateway/src/config/server/plain_quic_port.rs b/vey-gateway/src/config/server/plain_quic_port.rs index 6c44a4912..4a027e5b2 100644 --- a/vey-gateway/src/config/server/plain_quic_port.rs +++ b/vey-gateway/src/config/server/plain_quic_port.rs @@ -8,7 +8,7 @@ use std::collections::BTreeSet; use anyhow::{Context, anyhow}; use bitflags::bitflags; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_tls_ticket::TlsTicketConfig; use vey_types::acl::AclNetworkRuleBuilder; @@ -62,7 +62,7 @@ impl PlainQuicPortConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut server = PlainQuicPortConfig::new(position); diff --git a/vey-gateway/src/config/server/plain_tcp_port.rs b/vey-gateway/src/config/server/plain_tcp_port.rs index d299a5232..8bdf01f97 100644 --- a/vey-gateway/src/config/server/plain_tcp_port.rs +++ b/vey-gateway/src/config/server/plain_tcp_port.rs @@ -7,7 +7,7 @@ use std::collections::BTreeSet; use std::time::Duration; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::acl::AclNetworkRuleBuilder; use vey_types::metrics::NodeName; @@ -46,7 +46,7 @@ impl PlainTcpPortConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut server = PlainTcpPortConfig::new(position); diff --git a/vey-gateway/src/config/server/rustls_proxy/host.rs b/vey-gateway/src/config/server/rustls_proxy/host.rs index 7345af74a..6125005fb 100644 --- a/vey-gateway/src/config/server/rustls_proxy/host.rs +++ b/vey-gateway/src/config/server/rustls_proxy/host.rs @@ -10,7 +10,7 @@ use anyhow::{Context, anyhow}; use rustls::server::WebPkiClientVerifier; use rustls::{RootCertStore, ServerConfig}; use rustls_pki_types::CertificateDer; -use yaml_rust::Yaml; +use saphyr::Yaml; use vey_types::collection::NamedValue; use vey_types::limit::RateLimitQuota; diff --git a/vey-gateway/src/config/server/rustls_proxy/mod.rs b/vey-gateway/src/config/server/rustls_proxy/mod.rs index 24b6ab8e4..a08e113bc 100644 --- a/vey-gateway/src/config/server/rustls_proxy/mod.rs +++ b/vey-gateway/src/config/server/rustls_proxy/mod.rs @@ -9,7 +9,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use ascii::AsciiString; use log::warn; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_io_ext::StreamCopyConfig; use vey_tls_ticket::TlsTicketConfig; @@ -79,7 +79,7 @@ impl RustlsProxyServerConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut server = RustlsProxyServerConfig::new(position); diff --git a/vey-gateway/src/discover/host_resolver/mod.rs b/vey-gateway/src/discover/host_resolver/mod.rs index a9bce68e5..8408ee466 100644 --- a/vey-gateway/src/discover/host_resolver/mod.rs +++ b/vey-gateway/src/discover/host_resolver/mod.rs @@ -7,8 +7,8 @@ use std::sync::Arc; use std::time::Duration; use anyhow::Context; +use saphyr::Yaml; use tokio::sync::watch; -use yaml_rust::Yaml; use vey_types::collection::WeightedValue; use vey_types::metrics::NodeName; diff --git a/vey-gateway/src/discover/mod.rs b/vey-gateway/src/discover/mod.rs index 509350810..f272fd8d1 100644 --- a/vey-gateway/src/discover/mod.rs +++ b/vey-gateway/src/discover/mod.rs @@ -7,8 +7,8 @@ use std::net::SocketAddr; use std::sync::Arc; use anyhow::anyhow; +use saphyr::Yaml; use tokio::sync::watch; -use yaml_rust::Yaml; use vey_types::collection::WeightedValue; use vey_types::metrics::NodeName; diff --git a/vey-gateway/src/discover/static_addr/mod.rs b/vey-gateway/src/discover/static_addr/mod.rs index fe7fe8bd6..8229e500f 100644 --- a/vey-gateway/src/discover/static_addr/mod.rs +++ b/vey-gateway/src/discover/static_addr/mod.rs @@ -6,8 +6,8 @@ use std::sync::Arc; use anyhow::Context; +use saphyr::Yaml; use tokio::sync::watch; -use yaml_rust::Yaml; use vey_types::metrics::NodeName; diff --git a/vey-iploc/Cargo.toml b/vey-iploc/Cargo.toml index a0b0b20fa..1a4e6c8db 100644 --- a/vey-iploc/Cargo.toml +++ b/vey-iploc/Cargo.toml @@ -17,7 +17,7 @@ clap.workspace = true ip_network_table.workspace = true log = { workspace = true, features = ["max_level_trace", "release_max_level_debug"] } tokio = { workspace = true, features = ["net", "io-util", "time", "signal", "macros"] } -yaml-rust.workspace = true +saphyr.workspace = true snmalloc = { workspace = true, optional = true } vey-macros.workspace = true vey-yaml.workspace = true diff --git a/vey-iploc/src/config/geoip.rs b/vey-iploc/src/config/geoip.rs index d0f946171..38b0e27f1 100644 --- a/vey-iploc/src/config/geoip.rs +++ b/vey-iploc/src/config/geoip.rs @@ -9,7 +9,7 @@ use std::sync::{Arc, Mutex}; use anyhow::anyhow; use ip_network_table::IpNetworkTable; -use yaml_rust::Yaml; +use saphyr::Yaml; use vey_geoip_db::{GeoIpAsnRecord, GeoIpCountryRecord}; @@ -30,7 +30,7 @@ static COUNTRY: Mutex> = Mutex::new(None); static ASN: Mutex> = Mutex::new(None); pub(crate) fn load(v: &Yaml, conf_dir: &Path) -> anyhow::Result<()> { - let Yaml::Hash(map) = v else { + let Yaml::Mapping(map) = v else { return Err(anyhow!("invalid value type")); }; diff --git a/vey-iploc/src/config/mod.rs b/vey-iploc/src/config/mod.rs index 30c13298d..44fe71f50 100644 --- a/vey-iploc/src/config/mod.rs +++ b/vey-iploc/src/config/mod.rs @@ -7,7 +7,7 @@ use std::path::Path; use anyhow::anyhow; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; pub(crate) mod geoip; @@ -19,7 +19,7 @@ pub fn load(program_name: &str) -> anyhow::Result<&'static Path> { // allow multiple docs, and treat them as the same vey_yaml::foreach_doc(config_file, |_, doc| match doc { - Yaml::Hash(map) => load_doc(map, program_name), + Yaml::Mapping(map) => load_doc(map, program_name), _ => Err(anyhow!("yaml doc root should be hash")), })?; @@ -41,14 +41,14 @@ fn reload_blocking() -> anyhow::Result<()> { server::clear(); if let Some(config_file) = vey_daemon::opts::config_file() { vey_yaml::foreach_doc(config_file, |_, doc| match doc { - Yaml::Hash(map) => reload_doc(map), + Yaml::Mapping(map) => reload_doc(map), _ => Err(anyhow!("yaml doc root should be hash")), })?; } Ok(()) } -fn reload_doc(map: &yaml::Hash) -> anyhow::Result<()> { +fn reload_doc(map: &saphyr::Mapping) -> anyhow::Result<()> { let conf_dir = vey_daemon::opts::config_dir() .ok_or_else(|| anyhow!("no valid config dir has been set"))?; vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { @@ -60,7 +60,7 @@ fn reload_doc(map: &yaml::Hash) -> anyhow::Result<()> { Ok(()) } -fn load_doc(map: &yaml::Hash, program_name: &str) -> anyhow::Result<()> { +fn load_doc(map: &saphyr::Mapping, program_name: &str) -> anyhow::Result<()> { let conf_dir = vey_daemon::opts::config_dir() .ok_or_else(|| anyhow!("no valid config dir has been set"))?; vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { diff --git a/vey-iploc/src/config/server/dummy.rs b/vey-iploc/src/config/server/dummy.rs index 481f2bfa6..17ec18071 100644 --- a/vey-iploc/src/config/server/dummy.rs +++ b/vey-iploc/src/config/server/dummy.rs @@ -4,7 +4,7 @@ */ use anyhow::anyhow; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::NodeName; @@ -20,7 +20,7 @@ impl DummyServerConfig { DummyServerConfig { name: name.clone() } } - pub(super) fn parse(map: &yaml::Hash) -> anyhow::Result { + pub(super) fn parse(map: &saphyr::Mapping) -> anyhow::Result { let mut server = DummyServerConfig { name: NodeName::default(), }; diff --git a/vey-iploc/src/config/server/mod.rs b/vey-iploc/src/config/server/mod.rs index 7383d1895..bac0b0a40 100644 --- a/vey-iploc/src/config/server/mod.rs +++ b/vey-iploc/src/config/server/mod.rs @@ -4,7 +4,7 @@ */ use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_macros::AnyConfig; use vey_types::metrics::NodeName; @@ -62,7 +62,7 @@ pub(crate) fn load_all(v: &Yaml) -> anyhow::Result<()> { Ok(()) } -fn load_server(map: &yaml::Hash) -> anyhow::Result { +fn load_server(map: &saphyr::Mapping) -> anyhow::Result { let server_type = vey_yaml::hash_get_required_str(map, CONFIG_KEY_SERVER_TYPE)?; match vey_yaml::key::normalize(server_type).as_str() { "dummy" => { diff --git a/vey-iploc/src/config/server/udp.rs b/vey-iploc/src/config/server/udp.rs index a056e0079..443d50273 100644 --- a/vey-iploc/src/config/server/udp.rs +++ b/vey-iploc/src/config/server/udp.rs @@ -4,7 +4,7 @@ */ use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::NodeName; use vey_types::net::UdpListenConfig; @@ -25,7 +25,7 @@ impl UdpServerConfig { } } - pub(super) fn parse(map: &yaml::Hash) -> anyhow::Result { + pub(super) fn parse(map: &saphyr::Mapping) -> anyhow::Result { let mut server = UdpServerConfig::new(); vey_yaml::foreach_kv(map, |k, v| server.set(k, v))?; server.check()?; @@ -78,10 +78,11 @@ impl ServerConfig for UdpServerConfig { mod tests { use super::super::ServerConfig; use super::*; + use saphyr::LoadableYamlNode; fn parse(text: &str) -> anyhow::Result { - let docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); - let Yaml::Hash(map) = &docs[0] else { + let docs = Yaml::load_from_str(text).unwrap(); + let Yaml::Mapping(map) = &docs[0] else { panic!("yaml root should be a map"); }; UdpServerConfig::parse(map) diff --git a/vey-iploc/src/config/server/unix.rs b/vey-iploc/src/config/server/unix.rs index 716a17a6a..74cd91243 100644 --- a/vey-iploc/src/config/server/unix.rs +++ b/vey-iploc/src/config/server/unix.rs @@ -6,7 +6,7 @@ use std::path::PathBuf; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::NodeName; @@ -26,7 +26,7 @@ impl UnixServerConfig { } } - pub(super) fn parse(map: &yaml::Hash) -> anyhow::Result { + pub(super) fn parse(map: &saphyr::Mapping) -> anyhow::Result { let mut server = UnixServerConfig::new(); vey_yaml::foreach_kv(map, |k, v| server.set(k, v))?; server.check()?; @@ -81,10 +81,11 @@ impl ServerConfig for UnixServerConfig { mod tests { use super::super::ServerConfig; use super::*; + use saphyr::LoadableYamlNode; fn parse(text: &str) -> anyhow::Result { - let docs = yaml_rust::YamlLoader::load_from_str(text).unwrap(); - let Yaml::Hash(map) = &docs[0] else { + let docs = Yaml::load_from_str(text).unwrap(); + let Yaml::Mapping(map) = &docs[0] else { panic!("yaml root should be a map"); }; UnixServerConfig::parse(map) diff --git a/vey-keyless/Cargo.toml b/vey-keyless/Cargo.toml index 5344826ec..60288d961 100644 --- a/vey-keyless/Cargo.toml +++ b/vey-keyless/Cargo.toml @@ -22,7 +22,7 @@ openssl.workspace = true openssl-probe = { workspace = true, optional = true } tokio-rustls.workspace = true tokio = { workspace = true, features = ["time", "sync", "fs", "rt"] } -yaml-rust.workspace = true +saphyr.workspace = true jiff.workspace = true uuid.workspace = true url.workspace = true diff --git a/vey-keyless/src/config/backend/async_job.rs b/vey-keyless/src/config/backend/async_job.rs index bbd5df088..f2fce4b0c 100644 --- a/vey-keyless/src/config/backend/async_job.rs +++ b/vey-keyless/src/config/backend/async_job.rs @@ -6,7 +6,7 @@ use std::time::Duration; use anyhow::anyhow; -use yaml_rust::Yaml; +use saphyr::Yaml; #[derive(Debug, Clone, Copy)] pub(crate) struct AsyncJobBackendConfig { @@ -23,7 +23,7 @@ impl Default for AsyncJobBackendConfig { impl AsyncJobBackendConfig { pub(super) fn parse_yaml(value: &Yaml) -> anyhow::Result { - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { let mut config = AsyncJobBackendConfig::default(); vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { "async_op_timeout" => { diff --git a/vey-keyless/src/config/backend/crypto_mb.rs b/vey-keyless/src/config/backend/crypto_mb.rs index a89cc0fbf..7e17f3f9f 100644 --- a/vey-keyless/src/config/backend/crypto_mb.rs +++ b/vey-keyless/src/config/backend/crypto_mb.rs @@ -4,7 +4,7 @@ */ use anyhow::anyhow; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; #[derive(Debug, Clone, Copy, Default)] pub(crate) struct CryptoMbBackendConfig {} @@ -12,11 +12,13 @@ pub(crate) struct CryptoMbBackendConfig {} impl CryptoMbBackendConfig { pub(super) fn parse_yaml(value: &Yaml) -> anyhow::Result { match value { - Yaml::Hash(map) => { + Yaml::Mapping(map) => { vey_yaml::foreach_kv(map, |k, _v| Err(anyhow!("invalid key {k}")))?; Ok(CryptoMbBackendConfig::default()) } - Yaml::Null | Yaml::Boolean(true) => Ok(CryptoMbBackendConfig::default()), + Yaml::Value(Scalar::Null) | Yaml::Value(Scalar::Boolean(true)) => { + Ok(CryptoMbBackendConfig::default()) + } _ => Err(anyhow!( "yaml value type for `crypto_mb` backend should be `map`" )), diff --git a/vey-keyless/src/config/backend/mod.rs b/vey-keyless/src/config/backend/mod.rs index 7d49422f4..8e47bd30c 100644 --- a/vey-keyless/src/config/backend/mod.rs +++ b/vey-keyless/src/config/backend/mod.rs @@ -7,7 +7,7 @@ use std::sync::OnceLock; use anyhow::anyhow; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; #[cfg(feature = "openssl-async-job")] mod async_job; @@ -61,7 +61,7 @@ pub(crate) enum BackendDriverConfig { pub(super) fn load(value: &Yaml) -> anyhow::Result<()> { let mut config = BackendConfig::default(); match value { - Yaml::Hash(map) => { + Yaml::Mapping(map) => { vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { "dispatch_channel_size" => { config.dispatch_channel_size = vey_yaml::value::as_usize(v)?; @@ -92,7 +92,7 @@ pub(super) fn load(value: &Yaml) -> anyhow::Result<()> { _ => Err(anyhow!("invalid key {k}")), })?; } - Yaml::String(s) => match vey_yaml::key::normalize(s).as_str() { + Yaml::Value(Scalar::String(s)) => match vey_yaml::key::normalize(s).as_str() { "simple" => {} #[cfg(feature = "openssl-async-job")] "async_job" | "openssl_async_job" => { diff --git a/vey-keyless/src/config/backend/qat.rs b/vey-keyless/src/config/backend/qat.rs index 03df40cde..2ce6e47a6 100644 --- a/vey-keyless/src/config/backend/qat.rs +++ b/vey-keyless/src/config/backend/qat.rs @@ -6,7 +6,7 @@ use std::time::Duration; use anyhow::anyhow; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; #[derive(Debug, Clone)] pub(crate) struct QatBackendConfig { @@ -26,7 +26,7 @@ impl Default for QatBackendConfig { impl QatBackendConfig { pub(super) fn parse_yaml(value: &Yaml) -> anyhow::Result { match value { - Yaml::Hash(map) => { + Yaml::Mapping(map) => { let mut config = QatBackendConfig::default(); vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { "process_name" => { @@ -41,7 +41,9 @@ impl QatBackendConfig { })?; Ok(config) } - Yaml::Null | Yaml::Boolean(true) => Ok(QatBackendConfig::default()), + Yaml::Value(Scalar::Null) | Yaml::Value(Scalar::Boolean(true)) => { + Ok(QatBackendConfig::default()) + } _ => Err(anyhow!("yaml value type for `qat` backend should be `map`")), } } diff --git a/vey-keyless/src/config/log.rs b/vey-keyless/src/config/log.rs index 1d4a7ebc9..48731c964 100644 --- a/vey-keyless/src/config/log.rs +++ b/vey-keyless/src/config/log.rs @@ -8,7 +8,7 @@ use std::path::Path; use std::sync::OnceLock; use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_daemon::log::LogConfig; @@ -18,11 +18,11 @@ static TASK_DEFAULT_LOG_CONFIG_CONTAINER: OnceLock = OnceLock::new(); pub(crate) fn load(v: &Yaml, conf_dir: &Path, program_name: &str) -> anyhow::Result<()> { let mut default_log_config: Option = None; match v { - Yaml::String(s) => { + Yaml::Value(Scalar::String(s)) => { let config = LogConfig::with_driver_name(s, program_name)?; default_log_config = Some(config); } - Yaml::Hash(map) => { + Yaml::Mapping(map) => { vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { "default" => { let config = LogConfig::parse_yaml(v, conf_dir, program_name) @@ -59,7 +59,7 @@ pub(crate) fn load(v: &Yaml, conf_dir: &Path, program_name: &str) -> anyhow::Res _ => Err(anyhow!("invalid key {k}")), })?; } - Yaml::Null => return Ok(()), + Yaml::Value(Scalar::Null) => return Ok(()), _ => return Err(anyhow!("invalid value type")), } if let Some(config) = default_log_config { diff --git a/vey-keyless/src/config/mod.rs b/vey-keyless/src/config/mod.rs index 88da225cb..a4bfca34c 100644 --- a/vey-keyless/src/config/mod.rs +++ b/vey-keyless/src/config/mod.rs @@ -7,7 +7,7 @@ use std::path::Path; use anyhow::anyhow; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; pub(crate) mod backend; pub(crate) mod log; @@ -20,7 +20,7 @@ pub fn load(program_name: &str) -> anyhow::Result<&'static Path> { // allow multiple docs, and treat them as the same vey_yaml::foreach_doc(config_file, |_, doc| match doc { - Yaml::Hash(map) => load_doc(map, program_name), + Yaml::Mapping(map) => load_doc(map, program_name), _ => Err(anyhow!("yaml doc root should be hash")), })?; @@ -43,14 +43,14 @@ fn reload_blocking() -> anyhow::Result<()> { if let Some(conf_file) = vey_daemon::opts::config_file() { // allow multiple docs, and treat them as the same vey_yaml::foreach_doc(conf_file, |_, doc| match doc { - Yaml::Hash(map) => reload_doc(map), + Yaml::Mapping(map) => reload_doc(map), _ => Err(anyhow!("yaml doc root should be hash")), })?; } Ok(()) } -fn reload_doc(map: &yaml::Hash) -> anyhow::Result<()> { +fn reload_doc(map: &saphyr::Mapping) -> anyhow::Result<()> { let conf_dir = vey_daemon::opts::config_dir() .ok_or_else(|| anyhow!("no valid config dir has been set"))?; vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { @@ -62,7 +62,7 @@ fn reload_doc(map: &yaml::Hash) -> anyhow::Result<()> { Ok(()) } -fn load_doc(map: &yaml::Hash, program_name: &str) -> anyhow::Result<()> { +fn load_doc(map: &saphyr::Mapping, program_name: &str) -> anyhow::Result<()> { let conf_dir = vey_daemon::opts::config_dir() .ok_or_else(|| anyhow!("no valid config dir has been set"))?; vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { diff --git a/vey-keyless/src/config/server/cloudflare.rs b/vey-keyless/src/config/server/cloudflare.rs index 42045f580..d0cf66dc6 100644 --- a/vey-keyless/src/config/server/cloudflare.rs +++ b/vey-keyless/src/config/server/cloudflare.rs @@ -9,8 +9,8 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use ascii::AsciiString; +use saphyr::Yaml; use slog::Logger; -use yaml_rust::{Yaml, yaml}; use vey_histogram::HistogramMetricsConfig; use vey_types::metrics::{MetricTagMap, NodeName}; @@ -56,7 +56,7 @@ impl CloudflareServerConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut server = CloudflareServerConfig::new(position); diff --git a/vey-keyless/src/config/server/mod.rs b/vey-keyless/src/config/server/mod.rs index 098acab96..13a2c86f4 100644 --- a/vey-keyless/src/config/server/mod.rs +++ b/vey-keyless/src/config/server/mod.rs @@ -8,7 +8,7 @@ use std::collections::HashSet; use std::path::Path; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_macros::AnyConfig; use vey_types::metrics::NodeName; @@ -102,7 +102,7 @@ fn describe_position(config: &AnyKeyServerConfig) -> String { } fn load_server( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { // the server type is optional, and defaults to the cloudflare keyless server diff --git a/vey-keyless/src/config/server/plain_tcp_port.rs b/vey-keyless/src/config/server/plain_tcp_port.rs index e1155721e..f515fcf92 100644 --- a/vey-keyless/src/config/server/plain_tcp_port.rs +++ b/vey-keyless/src/config/server/plain_tcp_port.rs @@ -7,7 +7,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::NodeName; use vey_types::net::{ProxyProtocolVersion, TcpListenConfig}; @@ -40,7 +40,7 @@ impl PlainTcpPortConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut server = PlainTcpPortConfig::new(position); diff --git a/vey-keyless/src/config/server/plain_tls_port.rs b/vey-keyless/src/config/server/plain_tls_port.rs index 7c619de21..c87eda504 100644 --- a/vey-keyless/src/config/server/plain_tls_port.rs +++ b/vey-keyless/src/config/server/plain_tls_port.rs @@ -7,7 +7,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_tls_ticket::TlsTicketConfig; use vey_types::metrics::NodeName; @@ -45,7 +45,7 @@ impl PlainTlsPortConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut server = PlainTlsPortConfig::new(position); diff --git a/vey-keyless/src/config/store/local.rs b/vey-keyless/src/config/store/local.rs index c391c3033..23a3bcb3f 100644 --- a/vey-keyless/src/config/store/local.rs +++ b/vey-keyless/src/config/store/local.rs @@ -9,8 +9,8 @@ use std::path::{Path, PathBuf}; use anyhow::anyhow; use log::{debug, warn}; use openssl::pkey::{PKey, Private}; +use saphyr::Yaml; use tokio::sync::oneshot; -use yaml_rust::{Yaml, yaml}; use vey_types::metrics::NodeName; use vey_yaml::YamlDocPosition; @@ -36,7 +36,7 @@ impl LocalKeyStoreConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut server = LocalKeyStoreConfig::new(position); diff --git a/vey-keyless/src/config/store/mod.rs b/vey-keyless/src/config/store/mod.rs index dbdc27f0a..064bb9bba 100644 --- a/vey-keyless/src/config/store/mod.rs +++ b/vey-keyless/src/config/store/mod.rs @@ -6,8 +6,8 @@ use std::path::Path; use anyhow::anyhow; +use saphyr::Yaml; use tokio::sync::oneshot; -use yaml_rust::{Yaml, yaml}; use vey_macros::AnyConfig; use vey_types::metrics::NodeName; @@ -55,7 +55,7 @@ pub(crate) fn load_all(v: &Yaml, conf_dir: &Path) -> anyhow::Result<()> { } fn load_store( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let store_type = vey_yaml::hash_get_required_str(map, CONFIG_KEY_STORE_TYPE)?; diff --git a/vey-keyless/src/config/store/redis.rs b/vey-keyless/src/config/store/redis.rs index c7d3e6247..648d25420 100644 --- a/vey-keyless/src/config/store/redis.rs +++ b/vey-keyless/src/config/store/redis.rs @@ -4,8 +4,8 @@ */ use anyhow::anyhow; +use saphyr::Yaml; use url::Url; -use yaml_rust::{Yaml, yaml}; use vey_types::metrics::NodeName; use vey_yaml::YamlDocPosition; @@ -29,7 +29,7 @@ impl RedisKeyStoreConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut server = RedisKeyStoreConfig::new(position); diff --git a/vey-proxy/Cargo.toml b/vey-proxy/Cargo.toml index 2f2545ede..70814cf89 100644 --- a/vey-proxy/Cargo.toml +++ b/vey-proxy/Cargo.toml @@ -16,7 +16,7 @@ async-recursion.workspace = true clap.workspace = true clap_complete.workspace = true arcstr.workspace = true -yaml-rust.workspace = true +saphyr.workspace = true futures-util.workspace = true rand.workspace = true fastrand.workspace = true diff --git a/vey-proxy/src/config/audit/auditor.rs b/vey-proxy/src/config/audit/auditor.rs index ea7dae040..4c8008906 100644 --- a/vey-proxy/src/config/audit/auditor.rs +++ b/vey-proxy/src/config/audit/auditor.rs @@ -8,7 +8,7 @@ use std::sync::Arc; use anyhow::{Context, anyhow}; use rand::distr::Bernoulli; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_cert_agent::CertAgentConfig; use vey_dpi::{ @@ -106,7 +106,7 @@ impl AuditorConfig { AuditorConfig::with_name(NodeName::default(), position) } - pub(crate) fn parse(&mut self, map: &yaml::Hash) -> anyhow::Result<()> { + pub(crate) fn parse(&mut self, map: &saphyr::Mapping) -> anyhow::Result<()> { vey_yaml::foreach_kv(map, |k, v| self.set(k, v))?; self.check()?; Ok(()) @@ -278,12 +278,12 @@ impl AuditorConfig { #[cfg(test)] mod tests { use super::*; - use yaml_rust::YamlLoader; + use saphyr::LoadableYamlNode; #[test] fn parse_server_id() { - let docs = YamlLoader::load_from_str("name: audit1\nserver_id: intercept-edge\n").unwrap(); - let Yaml::Hash(map) = &docs[0] else { + let docs = Yaml::load_from_str("name: audit1\nserver_id: intercept-edge\n").unwrap(); + let Yaml::Mapping(map) = &docs[0] else { panic!("expected map"); }; let mut cfg = AuditorConfig::new(None); @@ -294,8 +294,8 @@ mod tests { #[test] fn parse_no_proxy_status() { - let docs = YamlLoader::load_from_str("name: audit1\nno_proxy_status: true\n").unwrap(); - let Yaml::Hash(map) = &docs[0] else { + let docs = Yaml::load_from_str("name: audit1\nno_proxy_status: true\n").unwrap(); + let Yaml::Mapping(map) = &docs[0] else { panic!("expected map"); }; let mut cfg = AuditorConfig::new(None); diff --git a/vey-proxy/src/config/audit/detour.rs b/vey-proxy/src/config/audit/detour.rs index c1e1292bb..d0d32a628 100644 --- a/vey-proxy/src/config/audit/detour.rs +++ b/vey-proxy/src/config/audit/detour.rs @@ -9,7 +9,7 @@ use std::str::FromStr; use std::time::Duration; use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_types::net::{ ConnectionPoolConfig, QuinnTransportConfigBuilder, RustlsClientConfigBuilder, @@ -55,7 +55,7 @@ impl AuditStreamDetourConfig { let mut config = AuditStreamDetourConfig::default(); match value { - Yaml::Hash(map) => { + Yaml::Mapping(map) => { vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { "peer" | "peer_addr" => { config.peer_addr = @@ -108,14 +108,14 @@ impl AuditStreamDetourConfig { _ => Err(anyhow!("invalid key {k}")), })?; } - Yaml::String(s) => { + Yaml::Value(Scalar::String(s)) => { config.peer_addr = UpstreamAddr::from_str(s).context("invalid upstream address string value")?; if config.peer_addr.port() == 0 { config.peer_addr.set_port(DEFAULT_DETOUR_PORT); } } - Yaml::Integer(i) => { + Yaml::Value(Scalar::Integer(i)) => { let port = u16::try_from(*i).map_err(|e| anyhow!("out of range u16 port value: {e}"))?; config.peer_addr.set_port(port); diff --git a/vey-proxy/src/config/audit/mod.rs b/vey-proxy/src/config/audit/mod.rs index ff1225be5..e5c9795a4 100644 --- a/vey-proxy/src/config/audit/mod.rs +++ b/vey-proxy/src/config/audit/mod.rs @@ -6,7 +6,7 @@ use std::path::Path; use anyhow::anyhow; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_yaml::{HybridParser, YamlDocPosition}; @@ -32,7 +32,7 @@ pub(crate) fn load_all(v: &Yaml, conf_dir: &Path) -> anyhow::Result<()> { pub(crate) fn load_at_position(position: &YamlDocPosition) -> anyhow::Result { let doc = vey_yaml::load_doc(position)?; - if let Yaml::Hash(map) = doc { + if let Yaml::Mapping(map) = doc { let auditor = load_auditor(&map, Some(position.clone()))?; registry::add(auditor.clone(), true)?; Ok(auditor) @@ -42,7 +42,7 @@ pub(crate) fn load_at_position(position: &YamlDocPosition) -> anyhow::Result, ) -> anyhow::Result { let mut auditor = AuditorConfig::new(position); diff --git a/vey-proxy/src/config/auth/group/basic.rs b/vey-proxy/src/config/auth/group/basic.rs index 5e11b7a42..8c1bf085e 100644 --- a/vey-proxy/src/config/auth/group/basic.rs +++ b/vey-proxy/src/config/auth/group/basic.rs @@ -11,7 +11,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use arcstr::ArcStr; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::NodeName; use vey_yaml::YamlDocPosition; @@ -69,7 +69,7 @@ impl BasicUserGroupConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut config = Self::new(position); @@ -94,9 +94,9 @@ impl BasicUserGroupConfig { Ok(()) } "static_users" => { - if let Yaml::Array(seq) = v { + if let Yaml::Sequence(seq) = v { for (i, obj) in seq.iter().enumerate() { - if let Yaml::Hash(map) = obj { + if let Yaml::Mapping(map) = obj { let user = Arc::new(UserConfig::parse_yaml(map, self.position.as_ref())?); let username = user.name().clone(); @@ -135,7 +135,7 @@ impl BasicUserGroupConfig { Ok(()) } "anonymous_user" => { - if let Yaml::Hash(map) = v { + if let Yaml::Mapping(map) = v { let mut user = UserConfig::parse_yaml(map, self.position.as_ref())?; user.set_no_password(); self.anonymous_user = Some(Arc::new(user)); diff --git a/vey-proxy/src/config/auth/group/facts.rs b/vey-proxy/src/config/auth/group/facts.rs index 644c5b196..fdd46ca4b 100644 --- a/vey-proxy/src/config/auth/group/facts.rs +++ b/vey-proxy/src/config/auth/group/facts.rs @@ -3,7 +3,7 @@ * SPDX-FileCopyrightText: 2026 VEY-OSS Developers. */ -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_yaml::YamlDocPosition; @@ -24,7 +24,7 @@ impl FactsUserGroupConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut config = Self::new(position); diff --git a/vey-proxy/src/config/auth/group/ldap.rs b/vey-proxy/src/config/auth/group/ldap.rs index 78b1c695a..dd458da86 100644 --- a/vey-proxy/src/config/auth/group/ldap.rs +++ b/vey-proxy/src/config/auth/group/ldap.rs @@ -9,7 +9,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use arcstr::ArcStr; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::net::{ConnectionPoolConfig, Host, OpensslClientConfigBuilder, UpstreamAddr}; use vey_yaml::YamlDocPosition; @@ -62,7 +62,7 @@ impl LdapUserGroupConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut config = Self::new(position); @@ -136,7 +136,7 @@ impl LdapUserGroupConfig { Ok(()) } "unmanaged_user" => { - if let Yaml::Hash(map) = v { + if let Yaml::Mapping(map) = v { let mut user = UserConfig::parse_yaml(map, self.basic.position.as_ref())?; user.set_no_password(); self.unmanaged_user = Some(Arc::new(user)); diff --git a/vey-proxy/src/config/auth/group/python_basic.rs b/vey-proxy/src/config/auth/group/python_basic.rs index 7ce15c129..7020e57aa 100644 --- a/vey-proxy/src/config/auth/group/python_basic.rs +++ b/vey-proxy/src/config/auth/group/python_basic.rs @@ -9,7 +9,7 @@ use std::sync::Arc; use std::time::Duration; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_yaml::YamlDocPosition; @@ -41,7 +41,7 @@ impl PythonBasicUserGroupConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut config = Self::new(position); @@ -67,7 +67,7 @@ impl PythonBasicUserGroupConfig { Ok(()) } "unmanaged_user" => { - if let Yaml::Hash(map) = v { + if let Yaml::Mapping(map) = v { let mut user = UserConfig::parse_yaml(map, self.basic.position.as_ref())?; user.set_no_password(); self.unmanaged_user = Some(Arc::new(user)); diff --git a/vey-proxy/src/config/auth/mod.rs b/vey-proxy/src/config/auth/mod.rs index bc6ca8047..41ff5a345 100644 --- a/vey-proxy/src/config/auth/mod.rs +++ b/vey-proxy/src/config/auth/mod.rs @@ -7,7 +7,7 @@ use std::path::Path; use anyhow::anyhow; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_yaml::{HybridParser, YamlDocPosition}; @@ -42,7 +42,7 @@ pub(crate) fn load_all(v: &Yaml, conf_dir: &Path) -> anyhow::Result<()> { pub(crate) fn load_at_position(position: &YamlDocPosition) -> anyhow::Result { let doc = vey_yaml::load_doc(position)?; - if let Yaml::Hash(map) = doc { + if let Yaml::Mapping(map) = doc { let group = load_user_group(&map, Some(position.clone()))?; registry::add(group.clone(), true)?; Ok(group) @@ -52,7 +52,7 @@ pub(crate) fn load_at_position(position: &YamlDocPosition) -> anyhow::Result, ) -> anyhow::Result { let group_type = diff --git a/vey-proxy/src/config/auth/source/file.rs b/vey-proxy/src/config/auth/source/file.rs index c798e2619..9431c3af3 100644 --- a/vey-proxy/src/config/auth/source/file.rs +++ b/vey-proxy/src/config/auth/source/file.rs @@ -8,8 +8,8 @@ use std::path::{Path, PathBuf}; use std::str::FromStr; use anyhow::{Context, anyhow}; +use saphyr::{LoadableYamlNode, Yaml}; use url::Url; -use yaml_rust::{Yaml, yaml}; use vey_types::fs::ConfigFileFormat; @@ -35,7 +35,7 @@ impl UserDynamicFileSource { UserDynamicFileSource { path, format } } - pub(super) fn parse_map(map: &yaml::Hash, lookup_dir: &Path) -> anyhow::Result { + pub(super) fn parse_map(map: &saphyr::Mapping, lookup_dir: &Path) -> anyhow::Result { let v = vey_yaml::hash_get_required(map, CONFIG_KEY_SOURCE_PATH)?; let path = vey_yaml::value::as_file_path(v, lookup_dir, false).context(format!( "invalid path value for key {CONFIG_KEY_SOURCE_PATH}" @@ -55,7 +55,7 @@ impl UserDynamicFileSource { let mut config = UserDynamicFileSource::new(path); for (k, v) in url.query_pairs() { - let yaml_value = Yaml::String(v.as_ref().to_owned()); + let yaml_value = vey_yaml::yaml_str!(v.as_ref()); config .set(&k, &yaml_value) .context(format!("failed to parse query param {k}={v}"))?; @@ -87,7 +87,7 @@ impl UserDynamicFileSource { } let all_config = match self.format { ConfigFileFormat::Yaml => { - let docs = yaml_rust::YamlLoader::load_from_str(&contents) + let docs = Yaml::load_from_str(&contents) .map_err(|e| anyhow!("invalid yaml file {}: {e}", self.path.display()))?; UserConfig::parse_yaml_many(&docs)? } diff --git a/vey-proxy/src/config/auth/source/lua.rs b/vey-proxy/src/config/auth/source/lua.rs index f97bf7a98..2eb93001e 100644 --- a/vey-proxy/src/config/auth/source/lua.rs +++ b/vey-proxy/src/config/auth/source/lua.rs @@ -7,7 +7,7 @@ use std::path::{Path, PathBuf}; use std::time::Duration; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::fs::ConfigFileFormat; @@ -33,7 +33,7 @@ impl Default for UserDynamicLuaSource { } impl UserDynamicLuaSource { - pub(super) fn parse_map(map: &yaml::Hash, lookup_dir: &Path) -> anyhow::Result { + pub(super) fn parse_map(map: &saphyr::Mapping, lookup_dir: &Path) -> anyhow::Result { let mut config = UserDynamicLuaSource::default(); vey_yaml::foreach_kv(map, |k, v| config.set(k, v, lookup_dir))?; diff --git a/vey-proxy/src/config/auth/source/mod.rs b/vey-proxy/src/config/auth/source/mod.rs index 4cbfbce21..327d533b6 100644 --- a/vey-proxy/src/config/auth/source/mod.rs +++ b/vey-proxy/src/config/auth/source/mod.rs @@ -7,8 +7,8 @@ use std::path::Path; use std::sync::Arc; use anyhow::anyhow; +use saphyr::{Scalar, Yaml}; use url::Url; -use yaml_rust::Yaml; pub(crate) mod file; use file::UserDynamicFileSource; @@ -37,7 +37,7 @@ pub(crate) enum UserDynamicSource { impl UserDynamicSource { pub(super) fn parse_config(v: &Yaml, lookup_dir: &Path) -> anyhow::Result { match v { - Yaml::Hash(map) => { + Yaml::Mapping(map) => { let source_type = vey_yaml::hash_get_required_str(map, CONFIG_KEY_SOURCE_TYPE)?; match vey_yaml::key::normalize(source_type).as_str() { @@ -58,7 +58,7 @@ impl UserDynamicSource { _ => Err(anyhow!("unsupported source type {source_type}")), } } - Yaml::String(url) => { + Yaml::Value(Scalar::String(url)) => { let url = Url::parse(url) .map_err(|e| anyhow!("the string value is not a valid url: {e}"))?; let scheme = url.scheme(); diff --git a/vey-proxy/src/config/auth/source/python.rs b/vey-proxy/src/config/auth/source/python.rs index f6bcd3d39..e0d36a48f 100644 --- a/vey-proxy/src/config/auth/source/python.rs +++ b/vey-proxy/src/config/auth/source/python.rs @@ -7,7 +7,7 @@ use std::path::{Path, PathBuf}; use std::time::Duration; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::fs::ConfigFileFormat; @@ -31,7 +31,7 @@ impl Default for UserDynamicPythonSource { } impl UserDynamicPythonSource { - pub(super) fn parse_map(map: &yaml::Hash, lookup_dir: &Path) -> anyhow::Result { + pub(super) fn parse_map(map: &saphyr::Mapping, lookup_dir: &Path) -> anyhow::Result { let mut config = UserDynamicPythonSource::default(); vey_yaml::foreach_kv(map, |k, v| config.set(k, v, lookup_dir))?; diff --git a/vey-proxy/src/config/auth/user/audit/yaml.rs b/vey-proxy/src/config/auth/user/audit/yaml.rs index 5152f503b..c9bf887f5 100644 --- a/vey-proxy/src/config/auth/user/audit/yaml.rs +++ b/vey-proxy/src/config/auth/user/audit/yaml.rs @@ -4,13 +4,13 @@ */ use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::Yaml; use super::UserAuditConfig; impl UserAuditConfig { pub(crate) fn parse_yaml(&mut self, v: &Yaml) -> anyhow::Result<()> { - if let Yaml::Hash(map) = v { + if let Yaml::Mapping(map) = v { vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { "enable_protocol_inspection" => { self.enable_protocol_inspection = vey_yaml::value::as_bool(v)?; diff --git a/vey-proxy/src/config/auth/user/name_params.rs b/vey-proxy/src/config/auth/user/name_params.rs index aad5b5221..38f1e7c1d 100644 --- a/vey-proxy/src/config/auth/user/name_params.rs +++ b/vey-proxy/src/config/auth/user/name_params.rs @@ -6,7 +6,7 @@ use std::collections::{BTreeMap, BTreeSet}; use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::Yaml; #[derive(Clone, Debug, Eq, PartialEq)] pub(crate) struct UsernameParamsConfig { @@ -29,7 +29,7 @@ impl UsernameParamsConfig { impl UsernameParamsConfig { pub(crate) fn parse(value: &Yaml) -> anyhow::Result { - if let Yaml::Hash(map) = value { + if let Yaml::Mapping(map) = value { let mut c = Self::new(); vey_yaml::foreach_kv(map, |k, v| c.set(k, v))?; c.check()?; @@ -137,6 +137,7 @@ impl UsernameParamsConfig { #[cfg(test)] mod tests { use super::*; + use vey_yaml::yaml_doc; #[test] diff --git a/vey-proxy/src/config/auth/user/site/yaml.rs b/vey-proxy/src/config/auth/user/site/yaml.rs index 147f978f6..9a18e7682 100644 --- a/vey-proxy/src/config/auth/user/site/yaml.rs +++ b/vey-proxy/src/config/auth/user/site/yaml.rs @@ -5,7 +5,7 @@ */ use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::Yaml; use vey_yaml::YamlDocPosition; @@ -13,7 +13,7 @@ use super::UserSiteConfig; impl UserSiteConfig { pub(crate) fn parse_yaml(v: &Yaml, position: Option<&YamlDocPosition>) -> anyhow::Result { - if let Yaml::Hash(map) = v { + if let Yaml::Mapping(map) = v { let mut config = UserSiteConfig::default(); vey_yaml::foreach_kv(map, |k, v| config.set_yaml(k, v, position))?; config.check()?; diff --git a/vey-proxy/src/config/auth/user/token/yaml.rs b/vey-proxy/src/config/auth/user/token/yaml.rs index 77af3cb6d..1afed0f48 100644 --- a/vey-proxy/src/config/auth/user/token/yaml.rs +++ b/vey-proxy/src/config/auth/user/token/yaml.rs @@ -4,7 +4,7 @@ */ use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::{Scalar, Yaml}; use vey_types::auth::FastHashedPassPhrase; use vey_xcrypt::XCryptHash; @@ -13,7 +13,7 @@ use super::{CONFIG_KEY_TYPE, PasswordToken}; const CONFIG_KEY_SALT: &str = "salt"; -fn as_fast_hash(map: &yaml::Hash) -> anyhow::Result { +fn as_fast_hash(map: &saphyr::Mapping) -> anyhow::Result { let salt = vey_yaml::hash_get_required_str(map, CONFIG_KEY_SALT)?; let mut pass = FastHashedPassPhrase::new(salt)?; @@ -21,7 +21,7 @@ fn as_fast_hash(map: &yaml::Hash) -> anyhow::Result { CONFIG_KEY_TYPE => Ok(()), CONFIG_KEY_SALT => Ok(()), "md5" => { - if let Yaml::String(s) = v { + if let Yaml::Value(Scalar::String(s)) = v { pass.push_md5(s) .context(format!("invalid md5 hash string value for key {k}")) } else { @@ -31,7 +31,7 @@ fn as_fast_hash(map: &yaml::Hash) -> anyhow::Result { } } "sha1" => { - if let Yaml::String(s) = v { + if let Yaml::Value(Scalar::String(s)) = v { pass.push_sha1(s) .context(format!("invalid sha1 hash string value for key {k}")) } else { @@ -41,7 +41,7 @@ fn as_fast_hash(map: &yaml::Hash) -> anyhow::Result { } } "blake3" | "b3" => { - if let Yaml::String(s) = v { + if let Yaml::Value(Scalar::String(s)) = v { pass.push_blake3(s) .context(format!("invalid blake3 hash string value for key {k}")) } else { @@ -59,8 +59,10 @@ fn as_fast_hash(map: &yaml::Hash) -> anyhow::Result { fn as_xcrypt_hash(v: &Yaml) -> anyhow::Result { match v { - Yaml::String(s) => XCryptHash::parse(s).map_err(|e| anyhow!("invalid xcrypt string: {e}")), - Yaml::Hash(map) => { + Yaml::Value(Scalar::String(s)) => { + XCryptHash::parse(s).map_err(|e| anyhow!("invalid xcrypt string: {e}")) + } + Yaml::Mapping(map) => { let s = vey_yaml::hash_get_required_str(map, "value")?; XCryptHash::parse(s).map_err(|e| anyhow!("invalid xcrypt string: {e}")) } @@ -71,8 +73,8 @@ fn as_xcrypt_hash(v: &Yaml) -> anyhow::Result { impl PasswordToken { pub(crate) fn parse_yaml(v: &Yaml) -> anyhow::Result { match v { - Yaml::String(_) => Ok(PasswordToken::XCrypt(as_xcrypt_hash(v)?)), - Yaml::Hash(map) => { + Yaml::Value(Scalar::String(_)) => Ok(PasswordToken::XCrypt(as_xcrypt_hash(v)?)), + Yaml::Mapping(map) => { if let Ok(map_type) = vey_yaml::hash_get_required_str(map, CONFIG_KEY_TYPE) { match vey_yaml::key::normalize(map_type).as_str() { "fast_hash" => Ok(PasswordToken::FastHash(as_fast_hash(map)?)), @@ -83,7 +85,7 @@ impl PasswordToken { Ok(PasswordToken::FastHash(as_fast_hash(map)?)) } } - Yaml::Null => Ok(PasswordToken::SkipVerify), + Yaml::Value(Scalar::Null) => Ok(PasswordToken::SkipVerify), _ => Err(anyhow!("invalid value type")), } } diff --git a/vey-proxy/src/config/auth/user/yaml.rs b/vey-proxy/src/config/auth/user/yaml.rs index 276332e18..3fa534236 100644 --- a/vey-proxy/src/config/auth/user/yaml.rs +++ b/vey-proxy/src/config/auth/user/yaml.rs @@ -7,7 +7,7 @@ use std::str::FromStr; use anyhow::{Context, anyhow}; use log::warn; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_yaml::YamlDocPosition; @@ -15,7 +15,7 @@ use super::{PasswordToken, UserConfig, UserSiteConfig}; impl UserConfig { pub(crate) fn parse_yaml( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option<&YamlDocPosition>, ) -> anyhow::Result { let mut config = UserConfig::default(); @@ -240,7 +240,7 @@ impl UserConfig { Ok(()) } "explicit_sites" => { - if let Yaml::Array(seq) = v { + if let Yaml::Sequence(seq) = v { for (i, v) in seq.iter().enumerate() { let site_group = UserSiteConfig::parse_yaml(v, position) .context(format!("invalid user site group value for {k}#{i}"))?; @@ -292,15 +292,15 @@ impl UserConfig { let mut users = Vec::new(); for (di, doc) in docs.iter().enumerate() { match doc { - Yaml::Hash(map) => { + Yaml::Mapping(map) => { let user = UserConfig::parse_yaml(map, None) .context(format!("invalid user config value for doc #{di}"))?; users.push(user); } - Yaml::Array(seq) => { + Yaml::Sequence(seq) => { for (i, v) in seq.iter().enumerate() { match v { - Yaml::Hash(map) => { + Yaml::Mapping(map) => { let user = UserConfig::parse_yaml(map, None).context(format!( "invalid user config value for doc #{di} record #{i}" ))?; diff --git a/vey-proxy/src/config/escaper/comply_audit.rs b/vey-proxy/src/config/escaper/comply_audit.rs index 440a58fc3..62beaa046 100644 --- a/vey-proxy/src/config/escaper/comply_audit.rs +++ b/vey-proxy/src/config/escaper/comply_audit.rs @@ -4,7 +4,7 @@ */ use anyhow::anyhow; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::NodeName; use vey_yaml::YamlDocPosition; @@ -33,7 +33,7 @@ impl ComplyAuditEscaperConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut escaper = Self::new(position); diff --git a/vey-proxy/src/config/escaper/comply_context/egress_index.rs b/vey-proxy/src/config/escaper/comply_context/egress_index.rs index 4444643fc..7ae289506 100644 --- a/vey-proxy/src/config/escaper/comply_context/egress_index.rs +++ b/vey-proxy/src/config/escaper/comply_context/egress_index.rs @@ -4,7 +4,7 @@ */ use anyhow::anyhow; -use yaml_rust::Yaml; +use saphyr::Yaml; use vey_types::metrics::NodeName; @@ -17,7 +17,7 @@ pub(crate) struct EgressIndexConfig { impl EgressIndexConfig { pub(super) fn parse(value: &Yaml) -> anyhow::Result { - let Yaml::Hash(map) = value else { + let Yaml::Mapping(map) = value else { return Err(anyhow!("egress upstream config should be a hash value")); }; diff --git a/vey-proxy/src/config/escaper/comply_context/egress_upstream.rs b/vey-proxy/src/config/escaper/comply_context/egress_upstream.rs index 1d6856f98..67a330aea 100644 --- a/vey-proxy/src/config/escaper/comply_context/egress_upstream.rs +++ b/vey-proxy/src/config/escaper/comply_context/egress_upstream.rs @@ -7,7 +7,7 @@ use std::collections::BTreeMap; use std::str::FromStr; use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::Yaml; use vey_types::metrics::NodeName; use vey_types::net::{DomainName, Host, UpstreamAddr}; @@ -36,7 +36,7 @@ pub(crate) struct EgressUpstreamConfig { impl EgressUpstreamConfig { pub(super) fn parse(value: &Yaml) -> anyhow::Result { - let Yaml::Hash(map) = value else { + let Yaml::Mapping(map) = value else { return Err(anyhow!("egress upstream config should be a hash value")); }; @@ -132,6 +132,7 @@ impl EgressUpstreamConfig { #[cfg(test)] mod tests { use super::*; + use vey_yaml::yaml_doc; #[test] diff --git a/vey-proxy/src/config/escaper/comply_context/mod.rs b/vey-proxy/src/config/escaper/comply_context/mod.rs index 1380eed11..039934d7a 100644 --- a/vey-proxy/src/config/escaper/comply_context/mod.rs +++ b/vey-proxy/src/config/escaper/comply_context/mod.rs @@ -4,7 +4,7 @@ */ use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::NodeName; use vey_yaml::YamlDocPosition; @@ -41,7 +41,7 @@ impl ComplyContextEscaperConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut escaper = Self::new(position); diff --git a/vey-proxy/src/config/escaper/direct_fixed.rs b/vey-proxy/src/config/escaper/direct_fixed.rs index 3e54250e7..14bf2536f 100644 --- a/vey-proxy/src/config/escaper/direct_fixed.rs +++ b/vey-proxy/src/config/escaper/direct_fixed.rs @@ -10,7 +10,7 @@ use std::sync::Arc; use anyhow::{Context, anyhow}; use ascii::AsciiString; use log::warn; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::acl::{AclAction, AclNetworkRuleBuilder}; use vey_types::metrics::{MetricTagMap, NodeName}; @@ -134,7 +134,7 @@ impl DirectFixedEscaperConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut config = Self::new(position); @@ -395,7 +395,7 @@ pub(crate) fn encode_foreign_port_hint(prefix: u16, port: u16) -> u32 { #[cfg(all(test, any(target_os = "linux", target_os = "freebsd")))] mod tests { use super::*; - use yaml_rust::YamlLoader; + use saphyr::LoadableYamlNode; #[test] fn encode_foreign_port_hint_layout() { @@ -405,8 +405,8 @@ mod tests { } fn parse_direct_fixed(yaml: &str) -> anyhow::Result { - let docs = YamlLoader::load_from_str(yaml).unwrap(); - let Yaml::Hash(map) = &docs[0] else { + let docs = Yaml::load_from_str(yaml).unwrap(); + let Yaml::Mapping(map) = &docs[0] else { panic!("expected map"); }; DirectFixedEscaperConfig::parse(map, None) @@ -471,11 +471,11 @@ mod tests { #[cfg(all(test, target_os = "openbsd"))] mod openbsd_tests { use super::*; - use yaml_rust::YamlLoader; + use saphyr::LoadableYamlNode; #[test] fn foreign_port_hint_prefix_rejected() { - let docs = YamlLoader::load_from_str( + let docs = Yaml::load_from_str( r#" name: direct type: DirectFixed @@ -485,7 +485,7 @@ mod openbsd_tests { "#, ) .unwrap(); - let Yaml::Hash(map) = &docs[0] else { + let Yaml::Mapping(map) = &docs[0] else { panic!("expected map"); }; let Err(err) = DirectFixedEscaperConfig::parse(map, None) else { diff --git a/vey-proxy/src/config/escaper/direct_float/mod.rs b/vey-proxy/src/config/escaper/direct_float/mod.rs index 28efa7d63..91b6c07fd 100644 --- a/vey-proxy/src/config/escaper/direct_float/mod.rs +++ b/vey-proxy/src/config/escaper/direct_float/mod.rs @@ -10,7 +10,7 @@ use std::sync::Arc; use anyhow::{Context, anyhow}; use ascii::AsciiString; use log::warn; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::acl::{AclAction, AclNetworkRuleBuilder}; use vey_types::metrics::{MetricTagMap, NodeName}; @@ -74,7 +74,7 @@ impl DirectFloatEscaperConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut config = Self::new(position); diff --git a/vey-proxy/src/config/escaper/divert_tcp.rs b/vey-proxy/src/config/escaper/divert_tcp.rs index ccc60e332..4ac8b75e7 100644 --- a/vey-proxy/src/config/escaper/divert_tcp.rs +++ b/vey-proxy/src/config/escaper/divert_tcp.rs @@ -9,7 +9,7 @@ use std::sync::Arc; use anyhow::{Context, anyhow}; use ascii::AsciiString; use log::warn; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::collection::SelectivePickPolicy; use vey_types::metrics::{MetricTagMap, NodeName}; @@ -90,7 +90,7 @@ impl DivertTcpEscaperConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut config = Self::new(position); diff --git a/vey-proxy/src/config/escaper/dummy_deny.rs b/vey-proxy/src/config/escaper/dummy_deny.rs index e89aef17c..5e53e5ca5 100644 --- a/vey-proxy/src/config/escaper/dummy_deny.rs +++ b/vey-proxy/src/config/escaper/dummy_deny.rs @@ -7,7 +7,7 @@ use std::sync::Arc; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::{MetricTagMap, NodeName}; use vey_yaml::YamlDocPosition; @@ -39,7 +39,7 @@ impl DummyDenyEscaperConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, custom_type: Option<&str>, ) -> anyhow::Result { diff --git a/vey-proxy/src/config/escaper/mod.rs b/vey-proxy/src/config/escaper/mod.rs index 238ea5cbb..ee116dd37 100644 --- a/vey-proxy/src/config/escaper/mod.rs +++ b/vey-proxy/src/config/escaper/mod.rs @@ -8,8 +8,8 @@ use std::path::Path; use std::sync::Arc; use anyhow::anyhow; +use saphyr::Yaml; use slog::Logger; -use yaml_rust::{Yaml, yaml}; use vey_daemon::config::TopoMap; use vey_macros::AnyConfig; @@ -133,7 +133,7 @@ pub(crate) fn load_all(v: &Yaml, conf_dir: &Path) -> anyhow::Result<()> { pub(crate) fn load_at_position(position: &YamlDocPosition) -> anyhow::Result { let doc = vey_yaml::load_doc(position)?; - if let Yaml::Hash(map) = doc { + if let Yaml::Mapping(map) = doc { let escaper = load_escaper(&map, Some(position.clone()))?; let old_escaper = registry::add(escaper.clone()); if let Err(e) = build_topology_map() { @@ -154,7 +154,7 @@ pub(crate) fn load_at_position(position: &YamlDocPosition) -> anyhow::Result, ) -> anyhow::Result { let escaper_type = vey_yaml::hash_get_required_str(map, CONFIG_KEY_ESCAPER_TYPE)?; diff --git a/vey-proxy/src/config/escaper/proxy_float/mod.rs b/vey-proxy/src/config/escaper/proxy_float/mod.rs index 144720ea5..bafb939f5 100644 --- a/vey-proxy/src/config/escaper/proxy_float/mod.rs +++ b/vey-proxy/src/config/escaper/proxy_float/mod.rs @@ -13,7 +13,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use ascii::AsciiString; use log::warn; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::{MetricTagMap, NodeName}; #[cfg(any( @@ -98,7 +98,7 @@ impl ProxyFloatEscaperConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut config = Self::new(position); diff --git a/vey-proxy/src/config/escaper/proxy_float/source/mod.rs b/vey-proxy/src/config/escaper/proxy_float/source/mod.rs index b864199d2..8fe434efc 100644 --- a/vey-proxy/src/config/escaper/proxy_float/source/mod.rs +++ b/vey-proxy/src/config/escaper/proxy_float/source/mod.rs @@ -4,8 +4,8 @@ */ use anyhow::anyhow; +use saphyr::{Scalar, Yaml}; use url::Url; -use yaml_rust::Yaml; use vey_yaml::YamlDocPosition; @@ -29,7 +29,7 @@ impl ProxyFloatSource { pub(super) fn parse(v: &Yaml, position: Option<&YamlDocPosition>) -> anyhow::Result { match v { - Yaml::Hash(map) => { + Yaml::Mapping(map) => { let source_type = vey_yaml::hash_get_required_str(map, CONFIG_KEY_SOURCE_TYPE)?; match vey_yaml::key::normalize(source_type).as_str() { @@ -41,7 +41,7 @@ impl ProxyFloatSource { _ => Err(anyhow!("unsupported source type {source_type}")), } } - Yaml::String(url) => { + Yaml::Value(Scalar::String(url)) => { let url = Url::parse(url) .map_err(|e| anyhow!("the string value is not a valid url: {e}"))?; let scheme = url.scheme(); @@ -53,7 +53,7 @@ impl ProxyFloatSource { _ => Err(anyhow!("unsupported url scheme: {scheme}")), } } - Yaml::Null => Ok(ProxyFloatSource::Passive), + Yaml::Value(Scalar::Null) => Ok(ProxyFloatSource::Passive), _ => Err(anyhow!("invalid value type for source")), } } diff --git a/vey-proxy/src/config/escaper/proxy_float/source/redis.rs b/vey-proxy/src/config/escaper/proxy_float/source/redis.rs index be1af4081..842c596a4 100644 --- a/vey-proxy/src/config/escaper/proxy_float/source/redis.rs +++ b/vey-proxy/src/config/escaper/proxy_float/source/redis.rs @@ -7,8 +7,8 @@ use std::str::FromStr; use anyhow::{Context, anyhow}; +use saphyr::Yaml; use url::Url; -use yaml_rust::{Yaml, yaml}; use vey_redis_client::RedisClientConfigBuilder; use vey_types::net::UpstreamAddr; @@ -29,7 +29,7 @@ impl ProxyFloatRedisSource { } pub(super) fn parse_map( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option<&YamlDocPosition>, ) -> anyhow::Result { let mut config = ProxyFloatRedisSource::default(); @@ -66,7 +66,7 @@ impl ProxyFloatRedisSource { } for (k, v) in url.query_pairs() { - let yaml_value = Yaml::String(v.as_ref().to_owned()); + let yaml_value = vey_yaml::yaml_str!(v.as_ref()); config .set(&k, &yaml_value, position) .context(format!("failed to parse query param {k}={v}"))?; diff --git a/vey-proxy/src/config/escaper/proxy_http.rs b/vey-proxy/src/config/escaper/proxy_http.rs index f6bc8602c..08cd115d5 100644 --- a/vey-proxy/src/config/escaper/proxy_http.rs +++ b/vey-proxy/src/config/escaper/proxy_http.rs @@ -10,7 +10,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use ascii::AsciiString; use log::warn; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::auth::{Password, Username}; use vey_types::collection::SelectivePickPolicy; @@ -109,7 +109,7 @@ impl ProxyHttpEscaperConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut config = Self::new(position); diff --git a/vey-proxy/src/config/escaper/proxy_https.rs b/vey-proxy/src/config/escaper/proxy_https.rs index 4d6d05678..8ee5d24f4 100644 --- a/vey-proxy/src/config/escaper/proxy_https.rs +++ b/vey-proxy/src/config/escaper/proxy_https.rs @@ -10,7 +10,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use ascii::AsciiString; use log::warn; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::auth::{Password, Username}; use vey_types::collection::SelectivePickPolicy; @@ -113,7 +113,7 @@ impl ProxyHttpsEscaperConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut config = Self::new(position); diff --git a/vey-proxy/src/config/escaper/proxy_socks5.rs b/vey-proxy/src/config/escaper/proxy_socks5.rs index 52cfd2e24..b8f6c5044 100644 --- a/vey-proxy/src/config/escaper/proxy_socks5.rs +++ b/vey-proxy/src/config/escaper/proxy_socks5.rs @@ -12,7 +12,7 @@ use anyhow::{Context, anyhow}; use ascii::AsciiString; use log::warn; use rustc_hash::FxHashMap; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::auth::{Password, Username}; use vey_types::collection::SelectivePickPolicy; @@ -111,7 +111,7 @@ impl ProxySocks5EscaperConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut config = Self::new(position); @@ -256,7 +256,7 @@ impl ProxySocks5EscaperConfig { Ok(()) } "transmute_udp_peer_ip" => { - if let Yaml::Hash(_) = v { + if let Yaml::Mapping(_) = v { let map = vey_yaml::value::as_hashmap( v, vey_yaml::value::as_ipaddr, diff --git a/vey-proxy/src/config/escaper/proxy_socks5s.rs b/vey-proxy/src/config/escaper/proxy_socks5s.rs index 60f3ee5eb..23b8f7a03 100644 --- a/vey-proxy/src/config/escaper/proxy_socks5s.rs +++ b/vey-proxy/src/config/escaper/proxy_socks5s.rs @@ -12,7 +12,7 @@ use anyhow::{Context, anyhow}; use ascii::AsciiString; use log::warn; use rustc_hash::FxHashMap; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::auth::{Password, Username}; use vey_types::collection::SelectivePickPolicy; @@ -115,7 +115,7 @@ impl ProxySocks5sEscaperConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut config = Self::new(position); @@ -277,7 +277,7 @@ impl ProxySocks5sEscaperConfig { Ok(()) } "transmute_udp_peer_ip" => { - if let Yaml::Hash(_) = v { + if let Yaml::Mapping(_) = v { let map = vey_yaml::value::as_hashmap( v, vey_yaml::value::as_ipaddr, diff --git a/vey-proxy/src/config/escaper/route_client.rs b/vey-proxy/src/config/escaper/route_client.rs index 4defb1f6e..e9393b0d6 100644 --- a/vey-proxy/src/config/escaper/route_client.rs +++ b/vey-proxy/src/config/escaper/route_client.rs @@ -8,8 +8,10 @@ use std::net::IpAddr; use anyhow::{Context, anyhow}; use ip_network::IpNetwork; + use vey_types::metrics::NodeName; -use yaml_rust::{Yaml, yaml}; + +use saphyr::Yaml; use vey_yaml::YamlDocPosition; @@ -39,11 +41,11 @@ impl RouteClientEscaperConfig { fn foreach_rule(k: &str, v: &Yaml, mut f: F) -> anyhow::Result<()> where - F: FnMut(&yaml::Hash) -> anyhow::Result<()>, + F: FnMut(&saphyr::Mapping) -> anyhow::Result<()>, { - if let Yaml::Array(seq) = v { + if let Yaml::Sequence(seq) = v { for (i, rule) in seq.iter().enumerate() { - if let Yaml::Hash(map) = rule { + if let Yaml::Mapping(map) = rule { f(map).context(format!("failed to parse rule {k}#{i}"))?; } else { return Err(anyhow!("invalid value type for {k}#{i}")); @@ -56,7 +58,7 @@ impl RouteClientEscaperConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut config = Self::new(position); @@ -106,7 +108,7 @@ impl RouteClientEscaperConfig { Ok(()) } - fn add_exact_match(&mut self, map: &yaml::Hash) -> anyhow::Result<()> { + fn add_exact_match(&mut self, map: &saphyr::Mapping) -> anyhow::Result<()> { let mut escaper = NodeName::default(); let mut all_ipaddr = BTreeSet::::new(); vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { @@ -115,7 +117,7 @@ impl RouteClientEscaperConfig { Ok(()) } "ips" | "ip" => { - if let Yaml::Array(seq) = v { + if let Yaml::Sequence(seq) = v { for (i, v) in seq.iter().enumerate() { let ip = vey_yaml::value::as_ipaddr(v) .context(format!("invalid host value for {k}:{i}"))?; @@ -139,7 +141,7 @@ impl RouteClientEscaperConfig { Ok(()) } - fn add_subnet_match(&mut self, map: &yaml::Hash) -> anyhow::Result<()> { + fn add_subnet_match(&mut self, map: &saphyr::Mapping) -> anyhow::Result<()> { let mut escaper = NodeName::default(); let mut all_subnets = BTreeSet::::new(); vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { @@ -148,7 +150,7 @@ impl RouteClientEscaperConfig { Ok(()) } "subnets" | "subnet" => { - if let Yaml::Array(seq) = v { + if let Yaml::Sequence(seq) = v { for (i, v) in seq.iter().enumerate() { let subnet = vey_yaml::value::as_ip_network(v) .context(format!("invalid subnet value for {k}:{i}"))?; diff --git a/vey-proxy/src/config/escaper/route_failover.rs b/vey-proxy/src/config/escaper/route_failover.rs index 7d0b35fab..6a01e72dc 100644 --- a/vey-proxy/src/config/escaper/route_failover.rs +++ b/vey-proxy/src/config/escaper/route_failover.rs @@ -7,7 +7,7 @@ use std::collections::BTreeSet; use std::time::Duration; use anyhow::anyhow; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::NodeName; use vey_yaml::YamlDocPosition; @@ -37,7 +37,7 @@ impl RouteFailoverEscaperConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut config = Self::new(position); diff --git a/vey-proxy/src/config/escaper/route_geoip.rs b/vey-proxy/src/config/escaper/route_geoip.rs index fa6911534..78ffe008a 100644 --- a/vey-proxy/src/config/escaper/route_geoip.rs +++ b/vey-proxy/src/config/escaper/route_geoip.rs @@ -8,7 +8,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use ip_network::IpNetwork; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_geoip_types::{ContinentCode, IsoCountryCode}; use vey_ip_locate::IpLocateServiceConfig; @@ -53,7 +53,7 @@ impl RouteGeoIpEscaperConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut config = Self::new(position); @@ -91,9 +91,9 @@ impl RouteGeoIpEscaperConfig { Ok(()) } "geo_rules" | "geo_match" => { - if let Yaml::Array(seq) = v { + if let Yaml::Sequence(seq) = v { for (i, rule) in seq.iter().enumerate() { - if let Yaml::Hash(map) = rule { + if let Yaml::Mapping(map) = rule { self.add_geo_rule(map)?; } else { return Err(anyhow!("invalid value type for {k}#{i}")); @@ -141,7 +141,7 @@ impl RouteGeoIpEscaperConfig { Ok(()) } - fn add_geo_rule(&mut self, map: &yaml::Hash) -> anyhow::Result<()> { + fn add_geo_rule(&mut self, map: &saphyr::Mapping) -> anyhow::Result<()> { let mut escaper = NodeName::default(); let mut networks = BTreeSet::::new(); let mut asn_set = BTreeSet::::new(); diff --git a/vey-proxy/src/config/escaper/route_mapping.rs b/vey-proxy/src/config/escaper/route_mapping.rs index be9519daf..c3574a724 100644 --- a/vey-proxy/src/config/escaper/route_mapping.rs +++ b/vey-proxy/src/config/escaper/route_mapping.rs @@ -7,8 +7,10 @@ use std::collections::BTreeSet; use anyhow::{Context, anyhow}; use indexmap::IndexSet; + use vey_types::metrics::NodeName; -use yaml_rust::{Yaml, yaml}; + +use saphyr::Yaml; use vey_yaml::YamlDocPosition; @@ -34,7 +36,7 @@ impl RouteMappingEscaperConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut config = Self::new(position); @@ -53,7 +55,7 @@ impl RouteMappingEscaperConfig { Ok(()) } "next" => { - if let Yaml::Array(seq) = v { + if let Yaml::Sequence(seq) = v { for (i, escaper) in seq.iter().enumerate() { let name = vey_yaml::value::as_metric_node_name(escaper) .context(format!("invalid metrics name value for {k}#{i}"))?; diff --git a/vey-proxy/src/config/escaper/route_query.rs b/vey-proxy/src/config/escaper/route_query.rs index 76b63fddd..b73081a8a 100644 --- a/vey-proxy/src/config/escaper/route_query.rs +++ b/vey-proxy/src/config/escaper/route_query.rs @@ -10,7 +10,7 @@ use std::num::NonZeroUsize; use std::time::Duration; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::collection::SelectivePickPolicy; use vey_types::metrics::NodeName; @@ -60,7 +60,7 @@ impl RouteQueryEscaperConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut config = Self::new(position); @@ -83,7 +83,7 @@ impl RouteQueryEscaperConfig { Ok(()) } "query_allowed_next" => { - if let Yaml::Array(seq) = v { + if let Yaml::Sequence(seq) = v { for (i, v) in seq.iter().enumerate() { let name = vey_yaml::value::as_metric_node_name(v) .context(format!("invalid metrics name value for {k}#{i}"))?; diff --git a/vey-proxy/src/config/escaper/route_resolved.rs b/vey-proxy/src/config/escaper/route_resolved.rs index 9399ab1ca..5d8b42375 100644 --- a/vey-proxy/src/config/escaper/route_resolved.rs +++ b/vey-proxy/src/config/escaper/route_resolved.rs @@ -9,7 +9,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use ip_network::IpNetwork; -use yaml_rust::{Yaml, yaml}; +use saphyr::{Scalar, Yaml}; use vey_types::metrics::NodeName; use vey_types::resolve::ResolveStrategy; @@ -44,7 +44,7 @@ impl RouteResolvedEscaperConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut config = Self::new(position); @@ -76,9 +76,9 @@ impl RouteResolvedEscaperConfig { Ok(()) } "lpm_match" | "lpm_rules" => { - if let Yaml::Array(seq) = v { + if let Yaml::Sequence(seq) = v { for (i, rule) in seq.iter().enumerate() { - if let Yaml::Hash(map) = rule { + if let Yaml::Mapping(map) = rule { self.add_lpm_rule(map)?; } else { return Err(anyhow!("invalid value type for {k}#{i}")); @@ -114,7 +114,7 @@ impl RouteResolvedEscaperConfig { Ok(()) } - fn add_lpm_rule(&mut self, map: &yaml::Hash) -> anyhow::Result<()> { + fn add_lpm_rule(&mut self, map: &saphyr::Mapping) -> anyhow::Result<()> { let mut escaper = NodeName::default(); let mut networks = BTreeSet::::new(); vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { @@ -123,9 +123,9 @@ impl RouteResolvedEscaperConfig { Ok(()) } "nets" | "net" | "networks" | "network" => { - if let Yaml::Array(seq) = v { + if let Yaml::Sequence(seq) = v { for (i, obj) in seq.iter().enumerate() { - if let Yaml::String(net) = obj { + if let Yaml::Value(Scalar::String(net)) = obj { let net = IpNetwork::from_str(net).map_err(|e| { anyhow!("invalid network string for {k}#{i}: {e:?}") })?; diff --git a/vey-proxy/src/config/escaper/route_select.rs b/vey-proxy/src/config/escaper/route_select.rs index 229bb4d70..8d548fa24 100644 --- a/vey-proxy/src/config/escaper/route_select.rs +++ b/vey-proxy/src/config/escaper/route_select.rs @@ -6,7 +6,7 @@ use std::collections::BTreeSet; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::collection::{SelectivePickPolicy, WeightedValue}; use vey_types::metrics::NodeName; @@ -35,7 +35,7 @@ impl RouteSelectEscaperConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut config = Self::new(position); diff --git a/vey-proxy/src/config/escaper/route_upstream/exact_match.rs b/vey-proxy/src/config/escaper/route_upstream/exact_match.rs index 565d9faac..764f4b32d 100644 --- a/vey-proxy/src/config/escaper/route_upstream/exact_match.rs +++ b/vey-proxy/src/config/escaper/route_upstream/exact_match.rs @@ -11,7 +11,7 @@ use std::str::FromStr; use ahash::AHashMap; use anyhow::{Context, anyhow}; use rustc_hash::FxHashMap; -use yaml_rust::Yaml; +use saphyr::Yaml; use vey_types::metrics::NodeName; use vey_types::net::{DomainName, Host}; @@ -40,7 +40,7 @@ impl ExactMatchBuilder { pub(super) fn set_by_yaml(&mut self, value: &Yaml) -> anyhow::Result<()> { match value { - Yaml::Hash(map) => vey_yaml::foreach_kv(map, |k, v| { + Yaml::Mapping(map) => vey_yaml::foreach_kv(map, |k, v| { let escaper = NodeName::from_str(k) .map_err(|e| anyhow!("the map key is not valid escaper name: {e}"))?; let mut match_values = ExactMatchValues::default(); @@ -51,9 +51,9 @@ impl ExactMatchBuilder { self.add_rule(escaper, match_values); Ok(()) }), - Yaml::Array(seq) => { + Yaml::Sequence(seq) => { for (i, v) in seq.iter().enumerate() { - let Yaml::Hash(map) = v else { + let Yaml::Mapping(map) = v else { return Err(anyhow!("yaml value type for #{i} should be map")); }; @@ -126,7 +126,7 @@ struct ExactMatchValues { impl ExactMatchValues { fn set_by_yaml(&mut self, value: &Yaml) -> anyhow::Result<()> { - if let Yaml::Array(seq) = value { + if let Yaml::Sequence(seq) = value { for (i, v) in seq.iter().enumerate() { self.add_yaml_value(v) .context(format!("invalid exact match value for #{i}"))?; @@ -169,8 +169,9 @@ impl ExactMatch { #[cfg(test)] mod tests { use super::*; + use saphyr::LoadableYamlNode; + use vey_types::literal_domain; - use yaml_rust::YamlLoader; #[test] fn yaml_seq() { @@ -183,7 +184,7 @@ mod tests { - 192.168.1.1 "#; - let v = YamlLoader::load_from_str(conf).unwrap(); + let v = Yaml::load_from_str(conf).unwrap(); let mut builder = ExactMatchBuilder::default(); builder.set_by_yaml(&v[0]).unwrap(); @@ -226,7 +227,7 @@ mod tests { - 192.168.1.1 "#; - let v = YamlLoader::load_from_str(conf).unwrap(); + let v = Yaml::load_from_str(conf).unwrap(); let mut builder = ExactMatchBuilder::default(); builder.set_by_yaml(&v[0]).unwrap(); diff --git a/vey-proxy/src/config/escaper/route_upstream/mod.rs b/vey-proxy/src/config/escaper/route_upstream/mod.rs index 8158e10ee..debe6eb54 100644 --- a/vey-proxy/src/config/escaper/route_upstream/mod.rs +++ b/vey-proxy/src/config/escaper/route_upstream/mod.rs @@ -7,7 +7,7 @@ use std::collections::BTreeSet; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::NodeName; use vey_yaml::YamlDocPosition; @@ -51,7 +51,7 @@ impl RouteUpstreamEscaperConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut config = Self::new(position); diff --git a/vey-proxy/src/config/escaper/route_upstream/regex_match.rs b/vey-proxy/src/config/escaper/route_upstream/regex_match.rs index 0211491c7..37eab7057 100644 --- a/vey-proxy/src/config/escaper/route_upstream/regex_match.rs +++ b/vey-proxy/src/config/escaper/route_upstream/regex_match.rs @@ -11,7 +11,7 @@ use std::str::FromStr; use anyhow::{Context, anyhow}; use radix_trie::{Trie, TrieCommon}; use regex::RegexSet; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use crate::config::escaper::verify::EscaperConfigVerifier; @@ -36,7 +36,7 @@ impl RegexMatchBuilder { pub(super) fn set_by_yaml(&mut self, value: &Yaml) -> anyhow::Result<()> { match value { - Yaml::Hash(map) => vey_yaml::foreach_kv(map, |k, v| { + Yaml::Mapping(map) => vey_yaml::foreach_kv(map, |k, v| { let escaper = NodeName::from_str(k) .map_err(|e| anyhow!("the map key is not valid escaper name: {e}"))?; let regexes = vey_yaml::value::as_list(v, RegexMatchValue::parse_yaml) @@ -44,9 +44,9 @@ impl RegexMatchBuilder { self.add_rule(escaper, regexes); Ok(()) }), - Yaml::Array(seq) => { + Yaml::Sequence(seq) => { for (i, v) in seq.iter().enumerate() { - let Yaml::Hash(map) = v else { + let Yaml::Mapping(map) = v else { return Err(anyhow!("yaml value type for #{i} should be map")); }; @@ -161,7 +161,7 @@ impl RegexMatchValue { fn parse_yaml(value: &Yaml) -> anyhow::Result { let mut match_value = RegexMatchValue::default(); match value { - Yaml::Hash(map) => { + Yaml::Mapping(map) => { vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { "suffix" | "parent" => { let domain = vey_yaml::value::as_domain(v)?; @@ -176,7 +176,7 @@ impl RegexMatchValue { _ => Err(anyhow!("invalid key {k}")), })? } - Yaml::String(_) => { + Yaml::Value(Scalar::String(_)) => { let regex = vey_yaml::value::as_regex(value)?; match_value.sub_domain_regex = regex.to_string(); } @@ -221,8 +221,9 @@ impl RegexMatch { #[cfg(test)] mod tests { use super::*; + use saphyr::LoadableYamlNode; + use vey_types::literal_domain; - use yaml_rust::YamlLoader; #[test] fn yaml_seq() { @@ -238,7 +239,7 @@ mod tests { - .*[.]example[.]org "#; - let v = YamlLoader::load_from_str(conf).unwrap(); + let v = Yaml::load_from_str(conf).unwrap(); let mut builder = RegexMatchBuilder::default(); builder.set_by_yaml(&v[0]).unwrap(); @@ -288,7 +289,7 @@ mod tests { - .*[.]example[.]org "#; - let v = YamlLoader::load_from_str(conf).unwrap(); + let v = Yaml::load_from_str(conf).unwrap(); let mut builder = RegexMatchBuilder::default(); builder.set_by_yaml(&v[0]).unwrap(); diff --git a/vey-proxy/src/config/escaper/route_upstream/subnet_match.rs b/vey-proxy/src/config/escaper/route_upstream/subnet_match.rs index 68fd4c1b8..18b6b8e24 100644 --- a/vey-proxy/src/config/escaper/route_upstream/subnet_match.rs +++ b/vey-proxy/src/config/escaper/route_upstream/subnet_match.rs @@ -10,7 +10,7 @@ use std::str::FromStr; use anyhow::{Context, anyhow}; use ip_network::IpNetwork; use ip_network_table::IpNetworkTable; -use yaml_rust::Yaml; +use saphyr::Yaml; use vey_types::metrics::NodeName; @@ -34,16 +34,16 @@ impl SubnetMatchBuilder { pub(super) fn set_by_yaml(&mut self, value: &Yaml) -> anyhow::Result<()> { match value { - Yaml::Hash(map) => vey_yaml::foreach_kv(map, |k, v| { + Yaml::Mapping(map) => vey_yaml::foreach_kv(map, |k, v| { let escaper = NodeName::from_str(k) .map_err(|e| anyhow!("the map key is not valid escaper name: {e}"))?; let subnets = vey_yaml::value::as_list(v, vey_yaml::value::as_ip_network)?; self.add_rule(escaper, subnets); Ok(()) }), - Yaml::Array(seq) => { + Yaml::Sequence(seq) => { for (i, v) in seq.iter().enumerate() { - let Yaml::Hash(map) = v else { + let Yaml::Mapping(map) = v else { return Err(anyhow!("yaml value type for #{i} should be map")); }; @@ -108,7 +108,7 @@ impl SubnetMatch { #[cfg(test)] mod tests { use super::*; - use yaml_rust::YamlLoader; + use saphyr::LoadableYamlNode; #[test] fn yaml_seq() { @@ -121,7 +121,7 @@ mod tests { - fe80::/64 "#; - let v = YamlLoader::load_from_str(conf).unwrap(); + let v = Yaml::load_from_str(conf).unwrap(); let mut builder = SubnetMatchBuilder::default(); builder.set_by_yaml(&v[0]).unwrap(); @@ -159,7 +159,7 @@ mod tests { - fe80::/64 "#; - let v = YamlLoader::load_from_str(conf).unwrap(); + let v = Yaml::load_from_str(conf).unwrap(); let mut builder = SubnetMatchBuilder::default(); builder.set_by_yaml(&v[0]).unwrap(); diff --git a/vey-proxy/src/config/escaper/route_upstream/suffix_match.rs b/vey-proxy/src/config/escaper/route_upstream/suffix_match.rs index 02ce0c5d6..2a7e1efaa 100644 --- a/vey-proxy/src/config/escaper/route_upstream/suffix_match.rs +++ b/vey-proxy/src/config/escaper/route_upstream/suffix_match.rs @@ -9,7 +9,7 @@ use std::str::FromStr; use anyhow::{Context, anyhow}; use radix_trie::{Trie, TrieCommon}; -use yaml_rust::Yaml; +use saphyr::Yaml; use vey_types::metrics::NodeName; use vey_types::net::DomainName; @@ -34,16 +34,16 @@ impl SuffixMatchBuilder { pub(super) fn set_by_yaml(&mut self, value: &Yaml) -> anyhow::Result<()> { match value { - Yaml::Hash(map) => vey_yaml::foreach_kv(map, |k, v| { + Yaml::Mapping(map) => vey_yaml::foreach_kv(map, |k, v| { let escaper = NodeName::from_str(k) .map_err(|e| anyhow!("the map key is not valid escaper name: {e}"))?; let domains = vey_yaml::value::as_list(v, vey_yaml::value::as_domain)?; self.add_rule(escaper, domains); Ok(()) }), - Yaml::Array(seq) => { + Yaml::Sequence(seq) => { for (i, v) in seq.iter().enumerate() { - let Yaml::Hash(map) = v else { + let Yaml::Mapping(map) = v else { return Err(anyhow!("yaml value type for #{i} should be map")); }; @@ -114,8 +114,9 @@ impl SuffixMatch { #[cfg(test)] mod tests { use super::*; + use saphyr::LoadableYamlNode; + use vey_types::literal_domain; - use yaml_rust::YamlLoader; #[test] fn yaml_seq() { @@ -128,7 +129,7 @@ mod tests { - example.org "#; - let v = YamlLoader::load_from_str(conf).unwrap(); + let v = Yaml::load_from_str(conf).unwrap(); let mut builder = SuffixMatchBuilder::default(); builder.set_by_yaml(&v[0]).unwrap(); @@ -167,7 +168,7 @@ mod tests { - example.org "#; - let v = YamlLoader::load_from_str(conf).unwrap(); + let v = Yaml::load_from_str(conf).unwrap(); let mut builder = SuffixMatchBuilder::default(); builder.set_by_yaml(&v[0]).unwrap(); diff --git a/vey-proxy/src/config/escaper/trick_float.rs b/vey-proxy/src/config/escaper/trick_float.rs index 62a116dc2..42fd617be 100644 --- a/vey-proxy/src/config/escaper/trick_float.rs +++ b/vey-proxy/src/config/escaper/trick_float.rs @@ -6,7 +6,7 @@ use std::collections::BTreeSet; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::NodeName; use vey_yaml::YamlDocPosition; @@ -32,7 +32,7 @@ impl TrickFloatEscaperConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut config = Self::new(position); @@ -51,7 +51,7 @@ impl TrickFloatEscaperConfig { Ok(()) } "next" => { - if let Yaml::Array(seq) = v { + if let Yaml::Sequence(seq) = v { for (i, escaper) in seq.iter().enumerate() { let name = vey_yaml::value::as_metric_node_name(escaper) .context(format!("invalid metrics name value for {k}#{i}"))?; diff --git a/vey-proxy/src/config/log.rs b/vey-proxy/src/config/log.rs index 085d2f176..67b5ac6cf 100644 --- a/vey-proxy/src/config/log.rs +++ b/vey-proxy/src/config/log.rs @@ -8,7 +8,7 @@ use std::path::Path; use std::sync::OnceLock; use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_daemon::log::LogConfig; @@ -20,11 +20,11 @@ static TASK_DEFAULT_LOG_CONFIG_CONTAINER: OnceLock = OnceLock::new(); pub(crate) fn load(v: &Yaml, conf_dir: &Path, program_name: &str) -> anyhow::Result<()> { let mut default_log_config: Option = None; match v { - Yaml::String(s) => { + Yaml::Value(Scalar::String(s)) => { let config = LogConfig::with_driver_name(s, program_name)?; default_log_config = Some(config); } - Yaml::Hash(map) => { + Yaml::Mapping(map) => { vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { "default" => { let config = LogConfig::parse_yaml(v, conf_dir, program_name) @@ -75,7 +75,7 @@ pub(crate) fn load(v: &Yaml, conf_dir: &Path, program_name: &str) -> anyhow::Res _ => Err(anyhow!("invalid key {k}")), })?; } - Yaml::Null => return Ok(()), + Yaml::Value(Scalar::Null) => return Ok(()), _ => return Err(anyhow!("invalid value type")), } if let Some(config) = default_log_config { diff --git a/vey-proxy/src/config/mod.rs b/vey-proxy/src/config/mod.rs index 4fb1ecb15..2c0b6364a 100644 --- a/vey-proxy/src/config/mod.rs +++ b/vey-proxy/src/config/mod.rs @@ -7,7 +7,7 @@ use std::path::Path; use anyhow::anyhow; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; mod graphviz; pub use graphviz::graphviz_graph; @@ -32,7 +32,7 @@ pub fn load(program_name: &str) -> anyhow::Result<&'static Path> { // allow multiple docs, and treat them as the same vey_yaml::foreach_doc(config_file, |_, doc| match doc { - Yaml::Hash(map) => load_doc(map, program_name), + Yaml::Mapping(map) => load_doc(map, program_name), _ => Err(anyhow!("yaml doc root should be hash")), })?; @@ -59,14 +59,14 @@ fn reload_blocking() -> anyhow::Result<()> { if let Some(conf_file) = vey_daemon::opts::config_file() { // allow multiple docs, and treat them as the same vey_yaml::foreach_doc(conf_file, |_, doc| match doc { - Yaml::Hash(map) => reload_doc(map), + Yaml::Mapping(map) => reload_doc(map), _ => Err(anyhow!("yaml doc root should be hash")), })?; } Ok(()) } -fn reload_doc(map: &yaml::Hash) -> anyhow::Result<()> { +fn reload_doc(map: &saphyr::Mapping) -> anyhow::Result<()> { let conf_dir = vey_daemon::opts::config_dir() .ok_or_else(|| anyhow!("no valid config dir has been set"))?; vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { @@ -82,7 +82,7 @@ fn reload_doc(map: &yaml::Hash) -> anyhow::Result<()> { Ok(()) } -fn load_doc(map: &yaml::Hash, program_name: &str) -> anyhow::Result<()> { +fn load_doc(map: &saphyr::Mapping, program_name: &str) -> anyhow::Result<()> { let conf_dir = vey_daemon::opts::config_dir() .ok_or_else(|| anyhow!("no valid config dir has been set"))?; vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { diff --git a/vey-proxy/src/config/resolver/c_ares.rs b/vey-proxy/src/config/resolver/c_ares.rs index 54922694a..c14342af8 100644 --- a/vey-proxy/src/config/resolver/c_ares.rs +++ b/vey-proxy/src/config/resolver/c_ares.rs @@ -8,7 +8,7 @@ use std::collections::BTreeSet; use std::net::{Ipv4Addr, Ipv6Addr, SocketAddr}; use anyhow::anyhow; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_resolver::driver::c_ares::CAresDriverConfig; use vey_resolver::{AnyResolveDriverConfig, ResolverRuntimeConfig}; @@ -60,7 +60,7 @@ impl CAresResolverConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut resolver = Self::new(position); diff --git a/vey-proxy/src/config/resolver/deny_all.rs b/vey-proxy/src/config/resolver/deny_all.rs index 7b470bec7..12d78feed 100644 --- a/vey-proxy/src/config/resolver/deny_all.rs +++ b/vey-proxy/src/config/resolver/deny_all.rs @@ -6,7 +6,7 @@ use std::collections::BTreeSet; use anyhow::anyhow; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::NodeName; use vey_yaml::YamlDocPosition; @@ -23,7 +23,7 @@ pub(crate) struct DenyAllResolverConfig { impl DenyAllResolverConfig { pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut resolver = DenyAllResolverConfig { diff --git a/vey-proxy/src/config/resolver/fail_over.rs b/vey-proxy/src/config/resolver/fail_over.rs index 21a6be755..23d78c2a5 100644 --- a/vey-proxy/src/config/resolver/fail_over.rs +++ b/vey-proxy/src/config/resolver/fail_over.rs @@ -6,7 +6,7 @@ use std::collections::BTreeSet; use anyhow::anyhow; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_resolver::ResolverRuntimeConfig; use vey_resolver::driver::fail_over::FailOverDriverStaticConfig; @@ -40,7 +40,7 @@ impl FailOverResolverConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut resolver = Self::new(position); diff --git a/vey-proxy/src/config/resolver/hickory.rs b/vey-proxy/src/config/resolver/hickory.rs index 748498c3b..bed8b1e80 100644 --- a/vey-proxy/src/config/resolver/hickory.rs +++ b/vey-proxy/src/config/resolver/hickory.rs @@ -8,7 +8,7 @@ use std::collections::BTreeSet; use std::net::IpAddr; use anyhow::anyhow; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_resolver::driver::hickory::HickoryDriverConfig; use vey_resolver::{AnyResolveDriverConfig, ResolverRuntimeConfig}; @@ -68,7 +68,7 @@ impl HickoryResolverConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut resolver = Self::new(position); diff --git a/vey-proxy/src/config/resolver/mod.rs b/vey-proxy/src/config/resolver/mod.rs index 0dfa7404c..c47e99d3f 100644 --- a/vey-proxy/src/config/resolver/mod.rs +++ b/vey-proxy/src/config/resolver/mod.rs @@ -8,7 +8,7 @@ use std::path::Path; use std::sync::Arc; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_daemon::config::TopoMap; use vey_macros::AnyConfig; @@ -75,7 +75,7 @@ pub(crate) fn load_all(v: &Yaml, conf_dir: &Path) -> anyhow::Result<()> { pub(crate) fn load_at_position(position: &YamlDocPosition) -> anyhow::Result { let doc = vey_yaml::load_doc(position)?; - if let Yaml::Hash(map) = doc { + if let Yaml::Mapping(map) = doc { let resolver = load_resolver(&map, Some(position.clone()))?; let old_resolver = registry::add(resolver.clone()); if let Err(e) = build_topology_map() { @@ -95,7 +95,7 @@ pub(crate) fn load_at_position(position: &YamlDocPosition) -> anyhow::Result, ) -> anyhow::Result { let resolver_type = vey_yaml::hash_get_required_str(map, CONFIG_KEY_RESOLVER_TYPE)?; diff --git a/vey-proxy/src/config/server/dummy_close.rs b/vey-proxy/src/config/server/dummy_close.rs index cf3bff184..247626557 100644 --- a/vey-proxy/src/config/server/dummy_close.rs +++ b/vey-proxy/src/config/server/dummy_close.rs @@ -4,7 +4,7 @@ */ use anyhow::anyhow; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::NodeName; use vey_yaml::YamlDocPosition; @@ -29,7 +29,7 @@ impl DummyCloseServerConfig { } pub(super) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut server = DummyCloseServerConfig { diff --git a/vey-proxy/src/config/server/http_expose.rs b/vey-proxy/src/config/server/http_expose.rs index 3e6740a5c..23e0d3bef 100644 --- a/vey-proxy/src/config/server/http_expose.rs +++ b/vey-proxy/src/config/server/http_expose.rs @@ -10,7 +10,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use ascii::AsciiString; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_io_ext::StreamCopyConfig; use vey_tls_ticket::TlsTicketConfig; @@ -126,7 +126,7 @@ impl HttpExposeServerConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut server = HttpExposeServerConfig::new(position); @@ -413,11 +413,11 @@ impl ServerConfig for HttpExposeServerConfig { #[cfg(test)] mod tests { use super::*; - use yaml_rust::YamlLoader; + use saphyr::LoadableYamlNode; #[test] fn reject_hosts_with_site_group() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local_in type: http_expose @@ -430,7 +430,7 @@ hosts: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; assert!(HttpExposeServerConfig::parse(map, None).is_err()); @@ -438,7 +438,7 @@ hosts: #[test] fn parse_site_group_only() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local_in type: http_expose @@ -449,7 +449,7 @@ user_group: local_visitors "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; let server = HttpExposeServerConfig::parse(map, None).unwrap(); diff --git a/vey-proxy/src/config/server/http_guard/h1.rs b/vey-proxy/src/config/server/http_guard/h1.rs index 2474257fd..8ff906a47 100644 --- a/vey-proxy/src/config/server/http_guard/h1.rs +++ b/vey-proxy/src/config/server/http_guard/h1.rs @@ -7,7 +7,7 @@ use std::num::NonZeroUsize; use std::time::Duration; use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::Yaml; #[derive(Clone, Debug, Eq, PartialEq)] pub(crate) struct HttpGuardH1Config { @@ -28,7 +28,7 @@ impl Default for HttpGuardH1Config { impl HttpGuardH1Config { pub(super) fn parse_yaml(&mut self, value: &Yaml) -> anyhow::Result<()> { - let Yaml::Hash(map) = value else { + let Yaml::Mapping(map) = value else { return Err(anyhow!("yaml value type for 'h1' should be 'map'")); }; vey_yaml::foreach_kv(map, |k, v| self.set(k, v)) diff --git a/vey-proxy/src/config/server/http_guard/h2.rs b/vey-proxy/src/config/server/http_guard/h2.rs index f5b2e4f68..d89753913 100644 --- a/vey-proxy/src/config/server/http_guard/h2.rs +++ b/vey-proxy/src/config/server/http_guard/h2.rs @@ -6,7 +6,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::Yaml; #[derive(Clone, Debug, Eq, PartialEq)] pub(crate) struct HttpGuardH2Config { @@ -65,7 +65,7 @@ impl HttpGuardH2Config { } pub(super) fn parse_yaml(&mut self, value: &Yaml) -> anyhow::Result<()> { - let Yaml::Hash(map) = value else { + let Yaml::Mapping(map) = value else { return Err(anyhow!("yaml value type for 'h2' should be 'map'")); }; vey_yaml::foreach_kv(map, |k, v| self.set(k, v)) diff --git a/vey-proxy/src/config/server/http_guard/mod.rs b/vey-proxy/src/config/server/http_guard/mod.rs index d8d58e157..ccd0ad269 100644 --- a/vey-proxy/src/config/server/http_guard/mod.rs +++ b/vey-proxy/src/config/server/http_guard/mod.rs @@ -8,7 +8,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use ascii::AsciiString; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_io_ext::StreamCopyConfig; use vey_tls_ticket::TlsTicketConfig; @@ -122,7 +122,7 @@ impl HttpGuardServerConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut server = HttpGuardServerConfig::new(position); @@ -376,11 +376,11 @@ impl ServerConfig for HttpGuardServerConfig { #[cfg(test)] mod tests { use super::*; - use yaml_rust::YamlLoader; + use saphyr::LoadableYamlNode; #[test] fn reject_hosts_with_site_group() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local_in type: http_guard @@ -393,7 +393,7 @@ hosts: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; assert!(HttpGuardServerConfig::parse(map, None).is_err()); @@ -401,7 +401,7 @@ hosts: #[test] fn parse_site_group_and_auditor() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: http_in type: http_guard @@ -412,7 +412,7 @@ auditor: icap_waf "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; let server = HttpGuardServerConfig::parse(map, None).unwrap(); @@ -423,7 +423,7 @@ auditor: icap_waf #[test] fn reject_user_group() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: http_in type: http_guard @@ -434,7 +434,7 @@ user_group: visitors "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; assert!(HttpGuardServerConfig::parse(map, None).is_err()); @@ -442,7 +442,7 @@ user_group: visitors #[test] fn parse_http_h1_h2() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: http_in type: http_guard @@ -457,7 +457,7 @@ h2: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; let server = HttpGuardServerConfig::parse(map, None).unwrap(); @@ -468,7 +468,7 @@ h2: #[test] fn reject_legacy_top_level_http_keys() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: http_in type: http_guard @@ -479,7 +479,7 @@ pipeline_size: 4 "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; assert!(HttpGuardServerConfig::parse(map, None).is_err()); @@ -487,7 +487,7 @@ pipeline_size: 4 #[test] fn reject_nested_http_map() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: http_in type: http_guard @@ -499,7 +499,7 @@ http: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; assert!(HttpGuardServerConfig::parse(map, None).is_err()); diff --git a/vey-proxy/src/config/server/http_proxy.rs b/vey-proxy/src/config/server/http_proxy.rs index 3ef418d7f..d269fb57d 100644 --- a/vey-proxy/src/config/server/http_proxy.rs +++ b/vey-proxy/src/config/server/http_proxy.rs @@ -13,7 +13,7 @@ use anyhow::{Context, anyhow}; use ascii::AsciiString; use http::HeaderName; use log::warn; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_ftp_client::FtpClientConfig; use vey_io_ext::{LimitedUdpRelayConfig, StreamCopyConfig}; @@ -159,7 +159,7 @@ impl HttpProxyServerConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut server = HttpProxyServerConfig::new(position); diff --git a/vey-proxy/src/config/server/intelli_proxy.rs b/vey-proxy/src/config/server/intelli_proxy.rs index 09677d578..43d0f8867 100644 --- a/vey-proxy/src/config/server/intelli_proxy.rs +++ b/vey-proxy/src/config/server/intelli_proxy.rs @@ -7,7 +7,7 @@ use std::collections::BTreeSet; use std::time::Duration; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::acl::AclNetworkRuleBuilder; use vey_types::metrics::NodeName; @@ -50,7 +50,7 @@ impl IntelliProxyConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut server = IntelliProxyConfig::new(position); diff --git a/vey-proxy/src/config/server/mod.rs b/vey-proxy/src/config/server/mod.rs index c32c52093..b0ad688dc 100644 --- a/vey-proxy/src/config/server/mod.rs +++ b/vey-proxy/src/config/server/mod.rs @@ -11,8 +11,8 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use log::warn; +use saphyr::Yaml; use slog::Logger; -use yaml_rust::{Yaml, yaml}; use vey_daemon::config::TopoMap; use vey_io_ext::StreamCopyConfig; @@ -193,7 +193,7 @@ pub(crate) fn load_all(v: &Yaml, conf_dir: &Path) -> anyhow::Result<()> { pub(crate) fn load_at_position(position: &YamlDocPosition) -> anyhow::Result { let doc = vey_yaml::load_doc(position)?; - if let Yaml::Hash(map) = doc { + if let Yaml::Mapping(map) = doc { let server = load_server(&map, Some(position.clone()))?; let old_server = registry::add(server.clone()); if let Err(e) = build_topology_map() { @@ -214,7 +214,7 @@ pub(crate) fn load_at_position(position: &YamlDocPosition) -> anyhow::Result, ) -> anyhow::Result { let server_type = vey_yaml::hash_get_required_str(map, CONFIG_KEY_SERVER_TYPE)?; diff --git a/vey-proxy/src/config/server/plain_quic_port.rs b/vey-proxy/src/config/server/plain_quic_port.rs index 9f348257c..3aa106a48 100644 --- a/vey-proxy/src/config/server/plain_quic_port.rs +++ b/vey-proxy/src/config/server/plain_quic_port.rs @@ -8,7 +8,7 @@ use std::collections::BTreeSet; use anyhow::{Context, anyhow}; use bitflags::bitflags; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_tls_ticket::TlsTicketConfig; use vey_types::acl::AclNetworkRuleBuilder; @@ -62,7 +62,7 @@ impl PlainQuicPortConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut server = PlainQuicPortConfig::new(position); diff --git a/vey-proxy/src/config/server/plain_tcp_port.rs b/vey-proxy/src/config/server/plain_tcp_port.rs index cef48c137..ebad524cd 100644 --- a/vey-proxy/src/config/server/plain_tcp_port.rs +++ b/vey-proxy/src/config/server/plain_tcp_port.rs @@ -7,7 +7,7 @@ use std::collections::BTreeSet; use std::time::Duration; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::acl::AclNetworkRuleBuilder; use vey_types::metrics::NodeName; @@ -46,7 +46,7 @@ impl PlainTcpPortConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut server = PlainTcpPortConfig::new(position); diff --git a/vey-proxy/src/config/server/plain_tls_port.rs b/vey-proxy/src/config/server/plain_tls_port.rs index 4ceb15a47..4d3dfa7b8 100644 --- a/vey-proxy/src/config/server/plain_tls_port.rs +++ b/vey-proxy/src/config/server/plain_tls_port.rs @@ -7,7 +7,7 @@ use std::collections::BTreeSet; use std::time::Duration; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_tls_ticket::TlsTicketConfig; use vey_types::acl::AclNetworkRuleBuilder; @@ -51,7 +51,7 @@ impl PlainTlsPortConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut server = PlainTlsPortConfig::new(position); diff --git a/vey-proxy/src/config/server/sni_proxy/host.rs b/vey-proxy/src/config/server/sni_proxy/host.rs index ea3777ced..33db4fc18 100644 --- a/vey-proxy/src/config/server/sni_proxy/host.rs +++ b/vey-proxy/src/config/server/sni_proxy/host.rs @@ -4,7 +4,7 @@ */ use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::Yaml; use vey_types::net::{Host, UpstreamAddr}; use vey_yaml::{YamlDocPosition, YamlMapCallback}; diff --git a/vey-proxy/src/config/server/sni_proxy/mod.rs b/vey-proxy/src/config/server/sni_proxy/mod.rs index 447277f65..6417cd8ef 100644 --- a/vey-proxy/src/config/server/sni_proxy/mod.rs +++ b/vey-proxy/src/config/server/sni_proxy/mod.rs @@ -10,7 +10,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use ascii::AsciiString; use log::warn; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_dpi::{ProtocolInspectionConfig, ProtocolPortMap}; use vey_io_ext::StreamCopyConfig; @@ -102,7 +102,7 @@ impl SniProxyServerConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut server = SniProxyServerConfig::new(position); diff --git a/vey-proxy/src/config/server/socks_proxy.rs b/vey-proxy/src/config/server/socks_proxy.rs index fff52d25e..d8ce1007c 100644 --- a/vey-proxy/src/config/server/socks_proxy.rs +++ b/vey-proxy/src/config/server/socks_proxy.rs @@ -12,7 +12,7 @@ use anyhow::{Context, anyhow}; use ascii::AsciiString; use log::warn; use rustc_hash::FxHashMap; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_io_ext::{LimitedUdpRelayConfig, StreamCopyConfig}; use vey_types::acl::{AclExactPortRule, AclNetworkRuleBuilder}; @@ -141,7 +141,7 @@ impl SocksProxyServerConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut server = Self::new(position); @@ -358,7 +358,7 @@ impl SocksProxyServerConfig { Ok(()) } "transmute_udp_echo_ip" => { - if let Yaml::Hash(_) = v { + if let Yaml::Mapping(_) = v { let map = vey_yaml::value::as_hashmap( v, vey_yaml::value::as_ipaddr, diff --git a/vey-proxy/src/config/server/tcp_stream.rs b/vey-proxy/src/config/server/tcp_stream.rs index 3805f2076..5ef2faaa4 100644 --- a/vey-proxy/src/config/server/tcp_stream.rs +++ b/vey-proxy/src/config/server/tcp_stream.rs @@ -9,7 +9,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use ascii::AsciiString; use log::warn; -use yaml_rust::{Yaml, yaml}; +use saphyr::{Scalar, Yaml}; use vey_io_ext::StreamCopyConfig; use vey_types::acl::AclNetworkRuleBuilder; @@ -88,7 +88,7 @@ impl TcpStreamServerConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut server = TcpStreamServerConfig::new(position); @@ -144,7 +144,7 @@ impl TcpStreamServerConfig { Ok(()) } "tls_client" => { - if let Yaml::Boolean(enable) = v { + if let Yaml::Value(Scalar::Boolean(enable)) = v { if *enable { self.client_tls_config = Some(OpensslClientConfigBuilder::with_cache_for_one_site()); diff --git a/vey-proxy/src/config/server/tcp_tproxy.rs b/vey-proxy/src/config/server/tcp_tproxy.rs index df0cdb261..afe375b11 100644 --- a/vey-proxy/src/config/server/tcp_tproxy.rs +++ b/vey-proxy/src/config/server/tcp_tproxy.rs @@ -10,7 +10,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use ascii::AsciiString; use log::warn; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_io_ext::StreamCopyConfig; use vey_types::acl::AclNetworkRuleBuilder; @@ -79,7 +79,7 @@ impl TcpTProxyServerConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut server = TcpTProxyServerConfig::new(position); diff --git a/vey-proxy/src/config/server/tls_proxy.rs b/vey-proxy/src/config/server/tls_proxy.rs index 6a2f5712a..88bd57f10 100644 --- a/vey-proxy/src/config/server/tls_proxy.rs +++ b/vey-proxy/src/config/server/tls_proxy.rs @@ -8,7 +8,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use ascii::AsciiString; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_io_ext::StreamCopyConfig; use vey_tls_ticket::TlsTicketConfig; @@ -75,7 +75,7 @@ impl TlsProxyServerConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut server = TlsProxyServerConfig::new(position); @@ -277,11 +277,11 @@ impl ServerConfig for TlsProxyServerConfig { #[cfg(test)] mod tests { use super::*; - use yaml_rust::YamlLoader; + use saphyr::LoadableYamlNode; #[test] fn parse_site_group() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: tls_in type: tls_proxy @@ -291,7 +291,7 @@ site_group: local "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; let server = TlsProxyServerConfig::parse(map, None).unwrap(); @@ -302,7 +302,7 @@ site_group: local #[test] fn reject_user_group() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: tls_in type: tls_proxy @@ -313,7 +313,7 @@ user_group: visitors "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; assert!(TlsProxyServerConfig::parse(map, None).is_err()); @@ -321,7 +321,7 @@ user_group: visitors #[test] fn reject_global_tls_server() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: tls_in type: tls_proxy @@ -335,7 +335,7 @@ global_tls_server: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; assert!(TlsProxyServerConfig::parse(map, None).is_err()); @@ -343,7 +343,7 @@ global_tls_server: #[test] fn reject_missing_site_group() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: tls_in type: tls_proxy @@ -352,7 +352,7 @@ escaper: default "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; assert!(TlsProxyServerConfig::parse(map, None).is_err()); diff --git a/vey-proxy/src/config/server/tls_stream.rs b/vey-proxy/src/config/server/tls_stream.rs index 9a2c584d0..6683a11e9 100644 --- a/vey-proxy/src/config/server/tls_stream.rs +++ b/vey-proxy/src/config/server/tls_stream.rs @@ -9,7 +9,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use ascii::AsciiString; use log::warn; -use yaml_rust::{Yaml, yaml}; +use saphyr::{Scalar, Yaml}; use vey_io_ext::StreamCopyConfig; use vey_tls_ticket::TlsTicketConfig; @@ -93,7 +93,7 @@ impl TlsStreamServerConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut server = TlsStreamServerConfig::new(position); @@ -163,7 +163,7 @@ impl TlsStreamServerConfig { Ok(()) } "tls_client" => { - if let Yaml::Boolean(enable) = v { + if let Yaml::Value(Scalar::Boolean(enable)) = v { if *enable { self.client_tls_config = Some(OpensslClientConfigBuilder::with_cache_for_one_site()); diff --git a/vey-proxy/src/config/server/udp_stream.rs b/vey-proxy/src/config/server/udp_stream.rs index ff958cce1..4810a6cba 100644 --- a/vey-proxy/src/config/server/udp_stream.rs +++ b/vey-proxy/src/config/server/udp_stream.rs @@ -9,7 +9,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use ascii::AsciiString; use bitflags::bitflags; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_io_ext::LimitedUdpRelayConfig; use vey_types::acl::AclNetworkRuleBuilder; @@ -88,7 +88,7 @@ impl UdpStreamServerConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut server = Self::new(position); diff --git a/vey-proxy/src/config/server/udp_tproxy.rs b/vey-proxy/src/config/server/udp_tproxy.rs index d4c6387b9..5d9dffa27 100644 --- a/vey-proxy/src/config/server/udp_tproxy.rs +++ b/vey-proxy/src/config/server/udp_tproxy.rs @@ -9,7 +9,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use ascii::AsciiString; use bitflags::bitflags; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_io_ext::LimitedUdpRelayConfig; use vey_types::acl::AclNetworkRuleBuilder; @@ -83,7 +83,7 @@ impl UdpTProxyServerConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut server = Self::new(position); diff --git a/vey-proxy/src/config/server/usual_tls_port.rs b/vey-proxy/src/config/server/usual_tls_port.rs index c0812a2f8..4d4b17afc 100644 --- a/vey-proxy/src/config/server/usual_tls_port.rs +++ b/vey-proxy/src/config/server/usual_tls_port.rs @@ -8,7 +8,7 @@ use std::collections::BTreeSet; use std::time::Duration; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_tls_ticket::TlsTicketConfig; use vey_types::acl::AclNetworkRuleBuilder; @@ -52,7 +52,7 @@ impl UsualTlsPortConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut server = UsualTlsPortConfig::new(position); diff --git a/vey-proxy/src/config/site/config.rs b/vey-proxy/src/config/site/config.rs index 41573609d..f893a9e17 100644 --- a/vey-proxy/src/config/site/config.rs +++ b/vey-proxy/src/config/site/config.rs @@ -8,7 +8,7 @@ use std::collections::{BTreeMap, BTreeSet}; use std::str::FromStr; use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::Yaml; use vey_dpi::MaybeProtocol; use vey_types::limit::RateLimitQuota; diff --git a/vey-proxy/src/config/site/group/import.rs b/vey-proxy/src/config/site/group/import.rs index b1c19549f..520273897 100644 --- a/vey-proxy/src/config/site/group/import.rs +++ b/vey-proxy/src/config/site/group/import.rs @@ -6,7 +6,7 @@ use std::collections::BTreeSet; use anyhow::{Context, anyhow}; -use yaml_rust::Yaml; +use saphyr::Yaml; use vey_types::metrics::NodeName; @@ -26,7 +26,7 @@ impl SiteGroupImportConfig { } pub(super) fn parse(v: &Yaml) -> anyhow::Result { - let Yaml::Hash(map) = v else { + let Yaml::Mapping(map) = v else { return Err(anyhow!("site group import value should be a map")); }; diff --git a/vey-proxy/src/config/site/group/mod.rs b/vey-proxy/src/config/site/group/mod.rs index a7e85f18e..39ef8a335 100644 --- a/vey-proxy/src/config/site/group/mod.rs +++ b/vey-proxy/src/config/site/group/mod.rs @@ -7,7 +7,7 @@ use std::collections::BTreeSet; use std::sync::Arc; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::NodeName; use vey_types::route::HostMatch; @@ -76,7 +76,7 @@ impl SiteGroupConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut group = SiteGroupConfig::new(position); @@ -148,13 +148,14 @@ mod tests { use std::str::FromStr; use super::*; + use saphyr::LoadableYamlNode; + use vey_types::metrics::NodeName; use vey_types::net::Host; - use yaml_rust::YamlLoader; #[test] fn parse_static_sites() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local tenant_user_group: customers @@ -169,7 +170,7 @@ static_sites: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; let group = SiteGroupConfig::parse(map, None).unwrap(); @@ -189,7 +190,7 @@ static_sites: #[test] fn parse_multi_ip_upstream() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local static_sites: @@ -203,7 +204,7 @@ static_sites: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; let group = SiteGroupConfig::parse(map, None).unwrap(); @@ -228,8 +229,8 @@ static_sites: upstream: - example.com:80 "#; - let yaml = YamlLoader::load_from_str(domain).unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let yaml = Yaml::load_from_str(domain).unwrap(); + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; assert!(SiteGroupConfig::parse(map, None).is_err()); @@ -243,8 +244,8 @@ static_sites: - 10.0.0.1:8080 - 10.0.0.1:8080 "#; - let yaml = YamlLoader::load_from_str(duplicate).unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let yaml = Yaml::load_from_str(duplicate).unwrap(); + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; let err = SiteGroupConfig::parse(map, None).unwrap_err(); @@ -253,7 +254,7 @@ static_sites: #[test] fn parse_site_tags() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local static_sites: @@ -266,7 +267,7 @@ static_sites: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; let group = SiteGroupConfig::parse(map, None).unwrap(); @@ -292,7 +293,7 @@ static_sites: #[test] fn parse_import() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: edge import: @@ -309,7 +310,7 @@ static_sites: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; let group = SiteGroupConfig::parse(map, None).unwrap(); @@ -335,7 +336,7 @@ static_sites: #[test] fn reject_self_import() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local import: @@ -344,7 +345,7 @@ import: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; assert!(SiteGroupConfig::parse(map, None).is_err()); @@ -352,7 +353,7 @@ import: #[test] fn reject_duplicate_static_site_id() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local static_sites: @@ -365,7 +366,7 @@ static_sites: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; let err = SiteGroupConfig::parse(map, None).unwrap_err(); @@ -377,7 +378,7 @@ static_sites: #[test] fn reject_duplicate_import() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local import: @@ -388,7 +389,7 @@ import: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; assert!(SiteGroupConfig::parse(map, None).is_err()); @@ -396,7 +397,7 @@ import: #[test] fn reject_import_without_tags() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local import: @@ -404,7 +405,7 @@ import: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; assert!(SiteGroupConfig::parse(map, None).is_err()); @@ -412,7 +413,7 @@ import: #[test] fn site_covers_host_from_own_match_rules() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local static_sites: @@ -425,7 +426,7 @@ static_sites: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; let group = SiteGroupConfig::parse(map, None).unwrap(); @@ -450,7 +451,7 @@ static_sites: #[test] fn parse_tls_inner_protocol() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local static_sites: @@ -461,7 +462,7 @@ static_sites: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; let group = SiteGroupConfig::parse(map, None).unwrap(); @@ -472,7 +473,7 @@ static_sites: #[test] fn parse_site_limits() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local static_sites: @@ -499,7 +500,7 @@ static_sites: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; let group = SiteGroupConfig::parse(map, None).unwrap(); @@ -524,7 +525,7 @@ static_sites: #[test] fn parse_site_http() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local static_sites: @@ -536,7 +537,7 @@ static_sites: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; let group = SiteGroupConfig::parse(map, None).unwrap(); @@ -565,7 +566,7 @@ static_sites: #[test] fn parse_site_http_forwarded_header_type() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local static_sites: @@ -577,7 +578,7 @@ static_sites: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; let group = SiteGroupConfig::parse(map, None).unwrap(); @@ -591,7 +592,7 @@ static_sites: #[test] fn parse_site_http_forwarded_trusted_from() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local static_sites: @@ -605,7 +606,7 @@ static_sites: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; let group = SiteGroupConfig::parse(map, None).unwrap(); @@ -622,7 +623,7 @@ static_sites: #[test] fn parse_site_http_h1_connection_pool_empty() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local static_sites: @@ -635,7 +636,7 @@ static_sites: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; let group = SiteGroupConfig::parse(map, None).unwrap(); @@ -649,7 +650,7 @@ static_sites: #[test] fn parse_site_http_h1_connection_pool_map() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local static_sites: @@ -664,7 +665,7 @@ static_sites: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; let group = SiteGroupConfig::parse(map, None).unwrap(); @@ -677,7 +678,7 @@ static_sites: #[test] fn parse_site_http_h1_upstream_keepalive() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local static_sites: @@ -692,7 +693,7 @@ static_sites: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; let group = SiteGroupConfig::parse(map, None).unwrap(); @@ -707,7 +708,7 @@ static_sites: #[test] fn parse_site_http_h1_nested_connection_pool() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local static_sites: @@ -725,7 +726,7 @@ static_sites: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; let group = SiteGroupConfig::parse(map, None).unwrap(); @@ -742,7 +743,7 @@ static_sites: #[test] fn parse_site_http_h2_connection_pool_empty() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local static_sites: @@ -755,7 +756,7 @@ static_sites: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; let group = SiteGroupConfig::parse(map, None).unwrap(); @@ -770,7 +771,7 @@ static_sites: #[test] fn parse_site_http_h2_connection_pool_map() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local static_sites: @@ -785,7 +786,7 @@ static_sites: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; let group = SiteGroupConfig::parse(map, None).unwrap(); @@ -798,7 +799,7 @@ static_sites: #[test] fn reject_invalid_site_http_h2_connection_pool() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local static_sites: @@ -811,7 +812,7 @@ static_sites: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; assert!(SiteGroupConfig::parse(map, None).is_err()); @@ -819,7 +820,7 @@ static_sites: #[test] fn parse_site_http_h2_force_upstream() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local static_sites: @@ -832,7 +833,7 @@ static_sites: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; let group = SiteGroupConfig::parse(map, None).unwrap(); @@ -843,7 +844,7 @@ static_sites: #[test] fn reject_unknown_site_http_h2_field() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local static_sites: @@ -856,7 +857,7 @@ static_sites: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; assert!(SiteGroupConfig::parse(map, None).is_err()); @@ -864,7 +865,7 @@ static_sites: #[test] fn reject_invalid_site_http_h1_connection_pool() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local static_sites: @@ -877,7 +878,7 @@ static_sites: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; assert!(SiteGroupConfig::parse(map, None).is_err()); @@ -885,7 +886,7 @@ static_sites: #[test] fn reject_legacy_site_http_h1_connection_pool_key() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local static_sites: @@ -897,7 +898,7 @@ static_sites: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; assert!(SiteGroupConfig::parse(map, None).is_err()); @@ -905,7 +906,7 @@ static_sites: #[test] fn parse_empty_site_http() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local static_sites: @@ -916,7 +917,7 @@ static_sites: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; let group = SiteGroupConfig::parse(map, None).unwrap(); @@ -927,7 +928,7 @@ static_sites: #[test] fn omit_site_http_uses_default() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local static_sites: @@ -937,7 +938,7 @@ static_sites: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; let group = SiteGroupConfig::parse(map, None).unwrap(); @@ -948,7 +949,7 @@ static_sites: #[test] fn reject_unknown_site_http_field() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local static_sites: @@ -960,7 +961,7 @@ static_sites: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; assert!(SiteGroupConfig::parse(map, None).is_err()); @@ -968,7 +969,7 @@ static_sites: #[test] fn reject_unknown_site_field() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local static_sites: @@ -979,7 +980,7 @@ static_sites: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; assert!(SiteGroupConfig::parse(map, None).is_err()); @@ -987,7 +988,7 @@ static_sites: #[test] fn reject_missing_site_id() { - let yaml = YamlLoader::load_from_str( + let yaml = Yaml::load_from_str( r#" name: local static_sites: @@ -996,7 +997,7 @@ static_sites: "#, ) .unwrap(); - let Yaml::Hash(map) = &yaml[0] else { + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; assert!(SiteGroupConfig::parse(map, None).is_err()); diff --git a/vey-proxy/src/config/site/http.rs b/vey-proxy/src/config/site/http.rs index 6c96a3a0f..cef6018dd 100644 --- a/vey-proxy/src/config/site/http.rs +++ b/vey-proxy/src/config/site/http.rs @@ -8,7 +8,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use ip_network::IpNetwork; use ip_network_table::IpNetworkTable; -use yaml_rust::Yaml; +use saphyr::Yaml; use vey_types::net::{ConnectionPoolConfig, HttpForwardedHeaderType, HttpKeepAliveConfig}; @@ -23,7 +23,7 @@ pub(crate) struct SiteHttpH1Config { impl SiteHttpH1Config { fn parse_yaml(&mut self, value: &Yaml) -> anyhow::Result<()> { - let Yaml::Hash(map) = value else { + let Yaml::Mapping(map) = value else { return Err(anyhow!( "yaml value type for 'site http h1' should be 'map'" )); @@ -69,7 +69,7 @@ impl Default for SiteHttpH2Config { impl SiteHttpH2Config { fn parse_yaml(&mut self, value: &Yaml) -> anyhow::Result<()> { - let Yaml::Hash(map) = value else { + let Yaml::Mapping(map) = value else { return Err(anyhow!( "yaml value type for 'site http h2' should be 'map'" )); @@ -114,7 +114,7 @@ pub(crate) struct SiteHttpConfig { impl SiteHttpConfig { pub(crate) fn parse_yaml(&mut self, value: &Yaml) -> anyhow::Result<()> { - let Yaml::Hash(map) = value else { + let Yaml::Mapping(map) = value else { return Err(anyhow!("yaml value type for 'site http' should be 'map'")); }; vey_yaml::foreach_kv(map, |k, v| self.set(k, v)) diff --git a/vey-proxy/src/config/site/mod.rs b/vey-proxy/src/config/site/mod.rs index 5a042b61e..e786289d2 100644 --- a/vey-proxy/src/config/site/mod.rs +++ b/vey-proxy/src/config/site/mod.rs @@ -7,7 +7,7 @@ use std::path::Path; use std::sync::Arc; use anyhow::anyhow; -use yaml_rust::Yaml; +use saphyr::Yaml; use vey_daemon::config::TopoMap; use vey_yaml::{HybridParser, YamlDocPosition}; @@ -46,7 +46,7 @@ pub(crate) fn load_all(v: &Yaml, conf_dir: &Path) -> anyhow::Result<()> { pub(crate) fn load_at_position(position: &YamlDocPosition) -> anyhow::Result { let doc = vey_yaml::load_doc(position)?; - if let Yaml::Hash(map) = doc { + if let Yaml::Mapping(map) = doc { let group = SiteGroupConfig::parse(&map, Some(position.clone()))?; let old_group = registry::add(group.clone()); if let Err(e) = build_topology_map() { diff --git a/vey-proxy/src/config/site/upstream.rs b/vey-proxy/src/config/site/upstream.rs index 7508be5d0..a0bc8b0fe 100644 --- a/vey-proxy/src/config/site/upstream.rs +++ b/vey-proxy/src/config/site/upstream.rs @@ -7,7 +7,7 @@ use std::collections::BTreeSet; use std::net::SocketAddr; use anyhow::anyhow; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_types::collection::{SelectivePickPolicy, WeightedValue}; use vey_types::net::UpstreamAddr; @@ -57,7 +57,7 @@ impl SiteUpstreamConfig { pub(crate) fn parse(value: &Yaml) -> anyhow::Result { match value { - Yaml::String(_) => { + Yaml::Value(Scalar::String(_)) => { let addr = vey_yaml::value::as_upstream_addr(value, 80)?; Ok(SiteUpstreamConfig { single: Some(addr), @@ -65,7 +65,7 @@ impl SiteUpstreamConfig { pick_policy: SelectivePickPolicy::RoundRobin, }) } - Yaml::Array(_) => { + Yaml::Sequence(_) => { let peers = vey_yaml::value::as_list(value, vey_yaml::value::as_weighted_sockaddr)?; if peers.is_empty() { return Err(anyhow!("upstream peer address list is empty")); diff --git a/vey-proxy/src/site/group.rs b/vey-proxy/src/site/group.rs index 4a7c762f2..5ee30cfb5 100644 --- a/vey-proxy/src/site/group.rs +++ b/vey-proxy/src/site/group.rs @@ -190,13 +190,12 @@ impl SiteGroup { mod tests { use std::str::FromStr; - use yaml_rust::YamlLoader; - use super::*; + use saphyr::{LoadableYamlNode, Yaml}; fn parse_group(s: &str) -> SiteGroupConfig { - let yaml = YamlLoader::load_from_str(s).unwrap(); - let yaml_rust::Yaml::Hash(map) = &yaml[0] else { + let yaml = Yaml::load_from_str(s).unwrap(); + let Yaml::Mapping(map) = &yaml[0] else { panic!("expected map"); }; SiteGroupConfig::parse(map, None).unwrap() diff --git a/vey-proxy/src/site/upstream.rs b/vey-proxy/src/site/upstream.rs index 81476fce2..4193a4405 100644 --- a/vey-proxy/src/site/upstream.rs +++ b/vey-proxy/src/site/upstream.rs @@ -175,12 +175,11 @@ mod tests { use std::net::Ipv4Addr; use std::str::FromStr; - use yaml_rust::YamlLoader; - use super::*; + use saphyr::{LoadableYamlNode, Yaml}; fn parse(yaml: &str) -> SiteUpstreamConfig { - let docs = YamlLoader::load_from_str(yaml).unwrap(); + let docs = Yaml::load_from_str(yaml).unwrap(); SiteUpstreamConfig::parse(&docs[0]).unwrap() } diff --git a/vey-statsd/Cargo.toml b/vey-statsd/Cargo.toml index c28089dd8..b2bbe5cd1 100644 --- a/vey-statsd/Cargo.toml +++ b/vey-statsd/Cargo.toml @@ -20,7 +20,7 @@ itoa.workspace = true zmij.workspace = true log = { workspace = true, features = ["max_level_trace", "release_max_level_debug"] } jiff.workspace = true -yaml-rust.workspace = true +saphyr.workspace = true fastrand.workspace = true tokio = { workspace = true, features = ["time", "signal", "net", "macros"] } capnp.workspace = true diff --git a/vey-statsd/src/config/collector/aggregate.rs b/vey-statsd/src/config/collector/aggregate.rs index b93705d87..7fe34914f 100644 --- a/vey-statsd/src/config/collector/aggregate.rs +++ b/vey-statsd/src/config/collector/aggregate.rs @@ -7,7 +7,7 @@ use std::collections::BTreeSet; use std::time::Duration; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::{MetricTagName, NodeName}; use vey_yaml::YamlDocPosition; @@ -39,7 +39,7 @@ impl AggregateCollectorConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut collector = AggregateCollectorConfig::new(position); diff --git a/vey-statsd/src/config/collector/discard.rs b/vey-statsd/src/config/collector/discard.rs index 1ed0d3438..2d369ef5b 100644 --- a/vey-statsd/src/config/collector/discard.rs +++ b/vey-statsd/src/config/collector/discard.rs @@ -5,7 +5,7 @@ */ use anyhow::anyhow; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::NodeName; use vey_yaml::YamlDocPosition; @@ -36,7 +36,7 @@ impl DiscardCollectorConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut collector = DiscardCollectorConfig::new(position); @@ -91,16 +91,16 @@ impl CollectorConfig for DiscardCollectorConfig { #[cfg(test)] mod tests { use super::*; - use yaml_rust::YamlLoader; + use saphyr::LoadableYamlNode; #[test] fn parse_ok_and_rejects_missing_name() { - let docs = YamlLoader::load_from_str("name: drop\n").unwrap(); - let cfg = DiscardCollectorConfig::parse(docs[0].as_hash().unwrap(), None).unwrap(); + let docs = Yaml::load_from_str("name: drop\n").unwrap(); + let cfg = DiscardCollectorConfig::parse(docs[0].as_mapping().unwrap(), None).unwrap(); assert_eq!(cfg.name().as_str(), "drop"); assert_eq!(cfg.collector_type(), "Discard"); - let docs = YamlLoader::load_from_str("type: Discard\n").unwrap(); - assert!(DiscardCollectorConfig::parse(docs[0].as_hash().unwrap(), None).is_err()); + let docs = Yaml::load_from_str("type: Discard\n").unwrap(); + assert!(DiscardCollectorConfig::parse(docs[0].as_mapping().unwrap(), None).is_err()); } } diff --git a/vey-statsd/src/config/collector/internal.rs b/vey-statsd/src/config/collector/internal.rs index 471db5167..5a7b1a956 100644 --- a/vey-statsd/src/config/collector/internal.rs +++ b/vey-statsd/src/config/collector/internal.rs @@ -6,7 +6,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::NodeName; use vey_yaml::YamlDocPosition; @@ -36,7 +36,7 @@ impl InternalCollectorConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut collector = InternalCollectorConfig::new(position); diff --git a/vey-statsd/src/config/collector/mod.rs b/vey-statsd/src/config/collector/mod.rs index 820a96255..2fdf3b7f3 100644 --- a/vey-statsd/src/config/collector/mod.rs +++ b/vey-statsd/src/config/collector/mod.rs @@ -8,7 +8,7 @@ use std::path::Path; use std::sync::Arc; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_daemon::config::TopoMap; use vey_macros::AnyConfig; @@ -77,7 +77,7 @@ pub(crate) fn load_all(v: &Yaml, conf_dir: &Path) -> anyhow::Result<()> { pub(crate) fn load_at_position(position: &YamlDocPosition) -> anyhow::Result { let doc = vey_yaml::load_doc(position)?; - if let Yaml::Hash(map) = doc { + if let Yaml::Mapping(map) = doc { let collector = load_collector(&map, Some(position.clone()))?; let old_collector = registry::add(collector.clone()); if let Err(e) = build_topology_map() { @@ -98,7 +98,7 @@ pub(crate) fn load_at_position(position: &YamlDocPosition) -> anyhow::Result, ) -> anyhow::Result { let collector_type = vey_yaml::hash_get_required_str(map, CONFIG_KEY_COLLECTOR_TYPE)?; diff --git a/vey-statsd/src/config/collector/regulate.rs b/vey-statsd/src/config/collector/regulate.rs index 4c0e11d93..1c465cf72 100644 --- a/vey-statsd/src/config/collector/regulate.rs +++ b/vey-statsd/src/config/collector/regulate.rs @@ -6,7 +6,7 @@ use std::collections::BTreeSet; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::{MetricTagName, NodeName}; use vey_yaml::YamlDocPosition; @@ -39,7 +39,7 @@ impl RegulateCollectorConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut collector = RegulateCollectorConfig::new(position); diff --git a/vey-statsd/src/config/exporter/console.rs b/vey-statsd/src/config/exporter/console.rs index a21f158de..5016d5658 100644 --- a/vey-statsd/src/config/exporter/console.rs +++ b/vey-statsd/src/config/exporter/console.rs @@ -4,7 +4,7 @@ */ use anyhow::anyhow; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::NodeName; use vey_yaml::YamlDocPosition; @@ -28,7 +28,7 @@ impl ConsoleExporterConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut collector = ConsoleExporterConfig::new(position); diff --git a/vey-statsd/src/config/exporter/discard.rs b/vey-statsd/src/config/exporter/discard.rs index 7f1c2d25e..de373067a 100644 --- a/vey-statsd/src/config/exporter/discard.rs +++ b/vey-statsd/src/config/exporter/discard.rs @@ -4,7 +4,7 @@ */ use anyhow::anyhow; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::NodeName; use vey_yaml::YamlDocPosition; @@ -35,7 +35,7 @@ impl DiscardExporterConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut collector = DiscardExporterConfig::new(position); diff --git a/vey-statsd/src/config/exporter/graphite.rs b/vey-statsd/src/config/exporter/graphite.rs index 93f43b26a..fde7d4e0a 100644 --- a/vey-statsd/src/config/exporter/graphite.rs +++ b/vey-statsd/src/config/exporter/graphite.rs @@ -7,7 +7,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::{MetricTagMap, NodeName}; use vey_yaml::YamlDocPosition; @@ -41,7 +41,7 @@ impl GraphiteExporterConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut collector = GraphiteExporterConfig::new(position); @@ -113,11 +113,11 @@ impl ExporterConfig for GraphiteExporterConfig { #[cfg(test)] mod tests { use super::*; - use yaml_rust::YamlLoader; + use saphyr::LoadableYamlNode; #[test] fn parse_exporter_config() { - let docs = YamlLoader::load_from_str( + let docs = Yaml::load_from_str( r#" name: g1 server: 127.0.0.1 @@ -127,7 +127,7 @@ prefix: app.metrics "#, ) .unwrap(); - let cfg = GraphiteExporterConfig::parse(docs[0].as_hash().unwrap(), None).unwrap(); + let cfg = GraphiteExporterConfig::parse(docs[0].as_mapping().unwrap(), None).unwrap(); assert_eq!(cfg.name().as_str(), "g1"); assert_eq!(cfg.emit_interval, Duration::from_secs(5)); assert_eq!( @@ -138,10 +138,10 @@ prefix: app.metrics #[test] fn parse_requires_name_and_server() { - let docs = YamlLoader::load_from_str("server: 127.0.0.1\n").unwrap(); - assert!(GraphiteExporterConfig::parse(docs[0].as_hash().unwrap(), None).is_err()); + let docs = Yaml::load_from_str("server: 127.0.0.1\n").unwrap(); + assert!(GraphiteExporterConfig::parse(docs[0].as_mapping().unwrap(), None).is_err()); - let docs = YamlLoader::load_from_str("name: g1\n").unwrap(); - assert!(GraphiteExporterConfig::parse(docs[0].as_hash().unwrap(), None).is_err()); + let docs = Yaml::load_from_str("name: g1\n").unwrap(); + assert!(GraphiteExporterConfig::parse(docs[0].as_mapping().unwrap(), None).is_err()); } } diff --git a/vey-statsd/src/config/exporter/influxdb/precision.rs b/vey-statsd/src/config/exporter/influxdb/precision.rs index aedba61cf..d8af7c0da 100644 --- a/vey-statsd/src/config/exporter/influxdb/precision.rs +++ b/vey-statsd/src/config/exporter/influxdb/precision.rs @@ -7,7 +7,7 @@ use std::str::FromStr; use anyhow::anyhow; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; #[derive(Clone, Copy, Debug, PartialEq, Eq)] pub(crate) enum TimestampPrecision { @@ -37,7 +37,7 @@ impl TimestampPrecision { } pub(crate) fn parse_yaml(value: &Yaml) -> anyhow::Result { - if let Yaml::String(s) = value { + if let Yaml::Value(Scalar::String(s)) = value { TimestampPrecision::from_str(s) } else { Err(anyhow!( @@ -64,6 +64,7 @@ impl FromStr for TimestampPrecision { #[cfg(test)] mod tests { use super::*; + use vey_yaml::yaml_str; #[test] fn from_str_aliases() { @@ -103,9 +104,9 @@ mod tests { #[test] fn parse_yaml() { assert_eq!( - TimestampPrecision::parse_yaml(&Yaml::String("us".into())).unwrap(), + TimestampPrecision::parse_yaml(&yaml_str!("us")).unwrap(), TimestampPrecision::MicroSeconds ); - assert!(TimestampPrecision::parse_yaml(&Yaml::Integer(1)).is_err()); + assert!(TimestampPrecision::parse_yaml(&Yaml::Value(Scalar::Integer(1))).is_err()); } } diff --git a/vey-statsd/src/config/exporter/influxdb/v2.rs b/vey-statsd/src/config/exporter/influxdb/v2.rs index 2b2239481..5fde5855c 100644 --- a/vey-statsd/src/config/exporter/influxdb/v2.rs +++ b/vey-statsd/src/config/exporter/influxdb/v2.rs @@ -9,7 +9,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use http::HeaderValue; use http::uri::PathAndQuery; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::{MetricTagMap, NodeName}; use vey_yaml::YamlDocPosition; @@ -56,7 +56,7 @@ impl InfluxdbV2ExporterConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut collector = InfluxdbV2ExporterConfig::new(position); diff --git a/vey-statsd/src/config/exporter/influxdb/v3.rs b/vey-statsd/src/config/exporter/influxdb/v3.rs index 3c72c9d54..9202fd158 100644 --- a/vey-statsd/src/config/exporter/influxdb/v3.rs +++ b/vey-statsd/src/config/exporter/influxdb/v3.rs @@ -9,7 +9,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use http::HeaderValue; use http::uri::PathAndQuery; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::{MetricTagMap, NodeName}; use vey_yaml::YamlDocPosition; @@ -58,7 +58,7 @@ impl InfluxdbV3ExporterConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut collector = InfluxdbV3ExporterConfig::new(position); diff --git a/vey-statsd/src/config/exporter/memory.rs b/vey-statsd/src/config/exporter/memory.rs index 8d4ba3af7..27a6449a0 100644 --- a/vey-statsd/src/config/exporter/memory.rs +++ b/vey-statsd/src/config/exporter/memory.rs @@ -7,7 +7,7 @@ use std::num::NonZeroUsize; use anyhow::anyhow; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::NodeName; use vey_yaml::YamlDocPosition; @@ -33,7 +33,7 @@ impl MemoryExporterConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut collector = MemoryExporterConfig::new(position); diff --git a/vey-statsd/src/config/exporter/mod.rs b/vey-statsd/src/config/exporter/mod.rs index 550e2ca70..5551074f0 100644 --- a/vey-statsd/src/config/exporter/mod.rs +++ b/vey-statsd/src/config/exporter/mod.rs @@ -7,7 +7,7 @@ use std::path::Path; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_macros::AnyConfig; use vey_types::metrics::NodeName; @@ -75,7 +75,7 @@ pub(crate) fn load_all(v: &Yaml, conf_dir: &Path) -> anyhow::Result<()> { pub(crate) fn load_at_position(position: &YamlDocPosition) -> anyhow::Result { let doc = vey_yaml::load_doc(position)?; - if let Yaml::Hash(map) = doc { + if let Yaml::Mapping(map) = doc { let exporter = load_exporter(&map, Some(position.clone()))?; registry::add(exporter.clone()); Ok(exporter) @@ -85,7 +85,7 @@ pub(crate) fn load_at_position(position: &YamlDocPosition) -> anyhow::Result, ) -> anyhow::Result { let exporter_type = vey_yaml::hash_get_required_str(map, CONFIG_KEY_EXPORTER_TYPE)?; diff --git a/vey-statsd/src/config/exporter/opentsdb.rs b/vey-statsd/src/config/exporter/opentsdb.rs index e92747e58..a5c8277ad 100644 --- a/vey-statsd/src/config/exporter/opentsdb.rs +++ b/vey-statsd/src/config/exporter/opentsdb.rs @@ -8,7 +8,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use http::uri::PathAndQuery; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::{MetricTagMap, NodeName}; use vey_yaml::YamlDocPosition; @@ -59,7 +59,7 @@ impl OpentsdbExporterConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut collector = OpentsdbExporterConfig::new(position); diff --git a/vey-statsd/src/config/exporter/prometheus_push.rs b/vey-statsd/src/config/exporter/prometheus_push.rs index 929a9aaeb..91a12757e 100644 --- a/vey-statsd/src/config/exporter/prometheus_push.rs +++ b/vey-statsd/src/config/exporter/prometheus_push.rs @@ -8,7 +8,7 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use http::uri::PathAndQuery; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::{MetricTagMap, NodeName}; use vey_yaml::YamlDocPosition; @@ -55,7 +55,7 @@ impl PrometheusPushExporterConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut collector = PrometheusPushExporterConfig::new(position); @@ -152,11 +152,11 @@ impl ExporterConfig for PrometheusPushExporterConfig { #[cfg(test)] mod tests { use super::*; - use yaml_rust::YamlLoader; + use saphyr::LoadableYamlNode; #[test] fn parse_exporter_config() { - let docs = YamlLoader::load_from_str( + let docs = Yaml::load_from_str( r#" name: p1 server: 127.0.0.1 @@ -170,7 +170,7 @@ prefix: app.metrics "#, ) .unwrap(); - let cfg = PrometheusPushExporterConfig::parse(docs[0].as_hash().unwrap(), None).unwrap(); + let cfg = PrometheusPushExporterConfig::parse(docs[0].as_mapping().unwrap(), None).unwrap(); assert_eq!(cfg.name().as_str(), "p1"); assert_eq!(cfg.emit_interval, Duration::from_secs(5)); assert_eq!(cfg.http_export.idle_timeout, Duration::from_secs(45)); @@ -186,7 +186,7 @@ prefix: app.metrics #[test] fn reject_path_without_slash() { - let docs = YamlLoader::load_from_str( + let docs = Yaml::load_from_str( r#" name: p1 server: 127.0.0.1 @@ -194,12 +194,12 @@ path: api/v1/push "#, ) .unwrap(); - assert!(PrometheusPushExporterConfig::parse(docs[0].as_hash().unwrap(), None).is_err()); + assert!(PrometheusPushExporterConfig::parse(docs[0].as_mapping().unwrap(), None).is_err()); } #[test] fn idle_timeout_uses_configured_value() { - let docs = YamlLoader::load_from_str( + let docs = Yaml::load_from_str( r#" name: p1 server: 127.0.0.1 @@ -207,7 +207,7 @@ idle_timeout: 30s "#, ) .unwrap(); - let cfg = PrometheusPushExporterConfig::parse(docs[0].as_hash().unwrap(), None).unwrap(); + let cfg = PrometheusPushExporterConfig::parse(docs[0].as_mapping().unwrap(), None).unwrap(); assert_eq!(cfg.http_export.idle_timeout, Duration::from_secs(30)); } } diff --git a/vey-statsd/src/config/importer/dummy.rs b/vey-statsd/src/config/importer/dummy.rs index 32b52dd00..cfa8d7b61 100644 --- a/vey-statsd/src/config/importer/dummy.rs +++ b/vey-statsd/src/config/importer/dummy.rs @@ -4,7 +4,7 @@ */ use anyhow::anyhow; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::NodeName; use vey_yaml::YamlDocPosition; @@ -35,7 +35,7 @@ impl DummyImporterConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut importer = DummyImporterConfig::new(position); diff --git a/vey-statsd/src/config/importer/mod.rs b/vey-statsd/src/config/importer/mod.rs index 772c41a08..ce044bd1c 100644 --- a/vey-statsd/src/config/importer/mod.rs +++ b/vey-statsd/src/config/importer/mod.rs @@ -6,7 +6,7 @@ use std::path::Path; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_macros::AnyConfig; use vey_types::metrics::NodeName; @@ -70,7 +70,7 @@ pub(crate) fn load_all(v: &Yaml, conf_dir: &Path) -> anyhow::Result<()> { pub(crate) fn load_at_position(position: &YamlDocPosition) -> anyhow::Result { let doc = vey_yaml::load_doc(position)?; - if let Yaml::Hash(map) = doc { + if let Yaml::Mapping(map) = doc { let importer = load_importer(&map, Some(position.clone()))?; registry::add(importer.clone()); Ok(importer) @@ -80,7 +80,7 @@ pub(crate) fn load_at_position(position: &YamlDocPosition) -> anyhow::Result, ) -> anyhow::Result { let importer_type = vey_yaml::hash_get_required_str(map, CONFIG_KEY_IMPORTER_TYPE)?; diff --git a/vey-statsd/src/config/importer/statsd/udp.rs b/vey-statsd/src/config/importer/statsd/udp.rs index 551822dc5..a01a41167 100644 --- a/vey-statsd/src/config/importer/statsd/udp.rs +++ b/vey-statsd/src/config/importer/statsd/udp.rs @@ -4,7 +4,7 @@ */ use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::acl::AclNetworkRuleBuilder; use vey_types::metrics::NodeName; @@ -38,7 +38,7 @@ impl StatsdUdpImporterConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut importer = StatsdUdpImporterConfig::new(position); diff --git a/vey-statsd/src/config/importer/statsd/unix.rs b/vey-statsd/src/config/importer/statsd/unix.rs index 6acca0d9f..5593046da 100644 --- a/vey-statsd/src/config/importer/statsd/unix.rs +++ b/vey-statsd/src/config/importer/statsd/unix.rs @@ -6,7 +6,7 @@ use std::path::PathBuf; use anyhow::{Context, anyhow}; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; use vey_types::metrics::NodeName; use vey_yaml::YamlDocPosition; @@ -34,7 +34,7 @@ impl StatsdUnixImporterConfig { } pub(crate) fn parse( - map: &yaml::Hash, + map: &saphyr::Mapping, position: Option, ) -> anyhow::Result { let mut importer = StatsdUnixImporterConfig::new(position); diff --git a/vey-statsd/src/config/mod.rs b/vey-statsd/src/config/mod.rs index e98dbb3b3..3159881f0 100644 --- a/vey-statsd/src/config/mod.rs +++ b/vey-statsd/src/config/mod.rs @@ -6,7 +6,7 @@ use std::path::Path; use anyhow::anyhow; -use yaml_rust::{Yaml, yaml}; +use saphyr::Yaml; pub(crate) mod collector; pub(crate) mod exporter; @@ -18,7 +18,7 @@ pub fn load() -> anyhow::Result<&'static Path> { // allow multiple docs, and treat them as the same vey_yaml::foreach_doc(config_file, |_, doc| match doc { - Yaml::Hash(map) => load_doc(map), + Yaml::Mapping(map) => load_doc(map), _ => Err(anyhow!("yaml doc root should be hash")), })?; @@ -42,14 +42,14 @@ fn reload_blocking() -> anyhow::Result<()> { if let Some(conf_file) = vey_daemon::opts::config_file() { // allow multiple docs, and treat them as the same vey_yaml::foreach_doc(conf_file, |_, doc| match doc { - Yaml::Hash(map) => reload_doc(map), + Yaml::Mapping(map) => reload_doc(map), _ => Err(anyhow!("yaml doc root should be hash")), })?; } Ok(()) } -fn reload_doc(map: &yaml::Hash) -> anyhow::Result<()> { +fn reload_doc(map: &saphyr::Mapping) -> anyhow::Result<()> { let conf_dir = vey_daemon::opts::config_dir() .ok_or_else(|| anyhow!("no valid config dir has been set"))?; vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { @@ -62,7 +62,7 @@ fn reload_doc(map: &yaml::Hash) -> anyhow::Result<()> { Ok(()) } -fn load_doc(map: &yaml::Hash) -> anyhow::Result<()> { +fn load_doc(map: &saphyr::Mapping) -> anyhow::Result<()> { let conf_dir = vey_daemon::opts::config_dir() .ok_or_else(|| anyhow!("no valid config dir has been set"))?; vey_yaml::foreach_kv(map, |k, v| match vey_yaml::key::normalize(k).as_str() { diff --git a/vey-statsd/src/export/graphite/format.rs b/vey-statsd/src/export/graphite/format.rs index b8529408a..c6504304f 100644 --- a/vey-statsd/src/export/graphite/format.rs +++ b/vey-statsd/src/export/graphite/format.rs @@ -118,9 +118,8 @@ impl StreamExport for GraphitePlaintextStreamExport { #[cfg(test)] mod tests { use super::*; - use yaml_rust::YamlLoader; - use crate::config::exporter::graphite::GraphiteExporterConfig; + use saphyr::{LoadableYamlNode, Yaml}; fn export( yaml: &str, @@ -128,8 +127,8 @@ mod tests { GraphitePlaintextAggregateExport, mpsc::UnboundedReceiver>, ) { - let docs = YamlLoader::load_from_str(yaml).unwrap(); - let cfg = GraphiteExporterConfig::parse(docs[0].as_hash().unwrap(), None).unwrap(); + let docs = Yaml::load_from_str(yaml).unwrap(); + let cfg = GraphiteExporterConfig::parse(docs[0].as_mapping().unwrap(), None).unwrap(); let (tx, rx) = mpsc::unbounded_channel(); (GraphitePlaintextAggregateExport::new(&cfg, tx), rx) } diff --git a/vey-statsd/src/export/prometheus_push/format.rs b/vey-statsd/src/export/prometheus_push/format.rs index 573e1c3e8..bbc6e24e3 100644 --- a/vey-statsd/src/export/prometheus_push/format.rs +++ b/vey-statsd/src/export/prometheus_push/format.rs @@ -372,7 +372,7 @@ mod tests { use std::str::FromStr; use super::*; - use yaml_rust::YamlLoader; + use saphyr::{LoadableYamlNode, Yaml}; use vey_types::metrics::{MetricTagName, MetricTagValue}; @@ -385,8 +385,8 @@ mod tests { PrometheusAggregateExport, mpsc::UnboundedReceiver, ) { - let docs = YamlLoader::load_from_str(yaml).unwrap(); - let cfg = PrometheusPushExporterConfig::parse(docs[0].as_hash().unwrap(), None).unwrap(); + let docs = Yaml::load_from_str(yaml).unwrap(); + let cfg = PrometheusPushExporterConfig::parse(docs[0].as_mapping().unwrap(), None).unwrap(); let (tx, rx) = mpsc::unbounded_channel(); (PrometheusAggregateExport::new(&cfg, tx), rx) } @@ -668,7 +668,7 @@ max_samples: 1 #[test] fn http_body_is_snappy_block() { - let docs = YamlLoader::load_from_str( + let docs = Yaml::load_from_str( r#" name: p1 server: 127.0.0.1 @@ -678,7 +678,7 @@ path: /api/v1/push "#, ) .unwrap(); - let cfg = PrometheusPushExporterConfig::parse(docs[0].as_hash().unwrap(), None).unwrap(); + let cfg = PrometheusPushExporterConfig::parse(docs[0].as_mapping().unwrap(), None).unwrap(); let mut http = PrometheusHttpExport::new(&cfg).unwrap(); assert_eq!(http.api_path().as_str(), "/api/v1/push"); assert_eq!( diff --git a/vey-statsd/src/runtime/export/http/config.rs b/vey-statsd/src/runtime/export/http/config.rs index 1cf4dd78b..7a16d553f 100644 --- a/vey-statsd/src/runtime/export/http/config.rs +++ b/vey-statsd/src/runtime/export/http/config.rs @@ -12,8 +12,8 @@ use anyhow::{Context, anyhow}; use http::HeaderMap; use http::uri::PathAndQuery; use log::warn; +use saphyr::Yaml; use tokio::net::TcpStream; -use yaml_rust::Yaml; use vey_socket::BindAddr; use vey_types::metrics::NodeName; diff --git a/vey-statsd/src/runtime/export/stream/config.rs b/vey-statsd/src/runtime/export/stream/config.rs index 6a5ef0e72..ff31a9d64 100644 --- a/vey-statsd/src/runtime/export/stream/config.rs +++ b/vey-statsd/src/runtime/export/stream/config.rs @@ -9,8 +9,8 @@ use std::time::Duration; use anyhow::{Context, anyhow}; use log::warn; +use saphyr::Yaml; use tokio::net::TcpStream; -use yaml_rust::Yaml; use vey_socket::BindAddr; use vey_types::metrics::NodeName; diff --git a/vey-statsd/src/types/name.rs b/vey-statsd/src/types/name.rs index 9f67346ca..787d4c153 100644 --- a/vey-statsd/src/types/name.rs +++ b/vey-statsd/src/types/name.rs @@ -9,7 +9,7 @@ use std::fmt::{self, Write}; use std::str::FromStr; use anyhow::anyhow; -use yaml_rust::Yaml; +use saphyr::{Scalar, Yaml}; use vey_types::metrics::{NodeName, ParseError}; @@ -48,11 +48,11 @@ impl MetricName { pub(crate) fn parse_yaml(value: &Yaml) -> anyhow::Result { match value { - Yaml::Array(_) => { + Yaml::Sequence(_) => { let nodes = vey_yaml::value::as_list(value, vey_yaml::value::as_metric_node_name)?; Ok(MetricName::from(nodes)) } - Yaml::String(s) => { + Yaml::Value(Scalar::String(s)) => { MetricName::parse(s).map_err(|e| anyhow!("invalid dotted metric name: {e}")) } _ => Err(anyhow!("invalid yaml value type for metric name")), @@ -91,6 +91,7 @@ impl fmt::Display for MetricNameDisplay<'_> { #[cfg(test)] mod tests { use super::*; + use vey_yaml::yaml_str; #[test] fn from_iter() { @@ -119,16 +120,13 @@ mod tests { #[test] fn parse_yaml_string_and_array() { - let name = MetricName::parse_yaml(&Yaml::String("x.y".to_string())).unwrap(); + let name = MetricName::parse_yaml(&yaml_str!("x.y")).unwrap(); assert_eq!(name.display('.').to_string(), "x.y"); - let arr = Yaml::Array(vec![ - Yaml::String("n1".to_string()), - Yaml::String("n2".to_string()), - ]); + let arr = Yaml::Sequence(vec![yaml_str!("n1"), yaml_str!("n2")]); let name = MetricName::parse_yaml(&arr).unwrap(); assert_eq!(name.display('.').to_string(), "n1.n2"); - assert!(MetricName::parse_yaml(&Yaml::Boolean(true)).is_err()); + assert!(MetricName::parse_yaml(&Yaml::Value(Scalar::Boolean(true))).is_err()); } }