Skip to main content

zip_with_kp

Macro zip_with_kp 

Source
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()));