From 2e47acaabadc2102603fb9dcb2d56d1e77db673e Mon Sep 17 00:00:00 2001 From: Gris Ge Date: Mon, 1 Jun 2026 11:13:05 +0800 Subject: [PATCH] bond: add FromStr/Display for BondAllPortActive Introduced support for parsing and displaying BondAllPortActive. FromStr accepts "dropped", "delivered", "0", and "1". Unit test cases included. Signed-off-by: Gris Ge --- src/link/link_info/bond.rs | 28 ++++++++++++++++++++++++++++ src/link/tests/bond.rs | 17 +++++++++++++++++ 2 files changed, 45 insertions(+) diff --git a/src/link/link_info/bond.rs b/src/link/link_info/bond.rs index 085753ec..67dceea6 100644 --- a/src/link/link_info/bond.rs +++ b/src/link/link_info/bond.rs @@ -688,6 +688,34 @@ impl From for u8 { } } +impl std::fmt::Display for BondAllPortActive { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + match self { + BondAllPortActive::Dropped => f.write_str("dropped"), + BondAllPortActive::Delivered => f.write_str("delivered"), + BondAllPortActive::Other(v) => write!(f, "{v}"), + } + } +} + +impl std::str::FromStr for BondAllPortActive { + type Err = DecodeError; + + fn from_str(s: &str) -> Result { + Ok(match s { + "dropped" => Self::Dropped, + "delivered" => Self::Delivered, + "0" => Self::Dropped, + "1" => Self::Delivered, + _ => { + return Err(DecodeError::from(format!( + "unknown bond all ports active: {s}" + ))) + } + }) + } +} + const AD_LACP_SLOW: u8 = 0; const AD_LACP_FAST: u8 = 1; diff --git a/src/link/tests/bond.rs b/src/link/tests/bond.rs index f07c1f5e..4ba0c383 100644 --- a/src/link/tests/bond.rs +++ b/src/link/tests/bond.rs @@ -324,3 +324,20 @@ fn test_bond_lacp_rate_from_str() { assert_eq!(BondLacpRate::Fast, "fast".parse().unwrap()); assert!(BondLacpRate::from_str("bogus").is_err()); } + +#[test] +fn test_bond_all_ports_active_from_str() { + use std::str::FromStr; + assert_eq!(BondAllPortActive::Dropped, "dropped".parse().unwrap()); + assert_eq!(BondAllPortActive::Delivered, "delivered".parse().unwrap()); + assert_eq!(BondAllPortActive::Dropped, "0".parse().unwrap()); + assert_eq!(BondAllPortActive::Delivered, "1".parse().unwrap()); + assert!(BondAllPortActive::from_str("bogus").is_err()); +} + +#[test] +fn test_bond_all_ports_active_display() { + assert_eq!("dropped", BondAllPortActive::Dropped.to_string()); + assert_eq!("delivered", BondAllPortActive::Delivered.to_string()); + assert_eq!("255", BondAllPortActive::Other(255).to_string()); +}