macro_rules! zip_with_kp {
($root:expr, $closure:expr => $kp1:expr, $kp2:expr) => { ... };
($root:expr, $closure:expr => $kp1:expr, $kp2:expr, $kp3:expr) => { ... };
($root:expr, $closure:expr => $kp1:expr, $kp2:expr, $kp3:expr, $kp4:expr) => { ... };
($root:expr, $closure:expr => $kp1:expr, $kp2:expr, $kp3:expr, $kp4:expr, $kp5:expr) => { ... };
($root:expr, $closure:expr => $kp1:expr, $kp2:expr, $kp3:expr, $kp4:expr, $kp5:expr, $kp6:expr) => { ... };
}Expand description
Zip multiple keypaths on the same root and apply a closure to the tuple of values.
Returns Some(closure((v1, v2, ...))) when all keypaths succeed, else None.
ยงExample
use rust_key_paths::{Kp, KpType, zip_with_kp};
struct User { name: String, age: u32, city: String }
let name_kp = KpType::new(|u: &User| Some(&u.name), |u: &mut User| Some(&mut u.name));
let age_kp = KpType::new(|u: &User| Some(&u.age), |u: &mut User| Some(&mut u.age));
let city_kp = KpType::new(|u: &User| Some(&u.city), |u: &mut User| Some(&mut u.city));
let user = User { name: "Alice".into(), age: 30, city: "NYC".into() };
let summary = zip_with_kp!(
&user,
|(name, age, city)| format!("{}, {} from {}", name, age, city) =>
name_kp,
age_kp,
city_kp
);
assert_eq!(summary, Some("Alice, 30 from NYC".to_string()));