diff --git a/primitives/src/witness.rs b/primitives/src/witness.rs index bbbc05376..e62b79833 100644 --- a/primitives/src/witness.rs +++ b/primitives/src/witness.rs @@ -403,6 +403,13 @@ impl<'a> IntoIterator for &'a Witness { fn into_iter(self) -> Self::IntoIter { self.iter() } } +impl> FromIterator for Witness { + fn from_iter>(iter: I) -> Self { + let v: Vec> = iter.into_iter().map(|item| Vec::from(item.as_ref())).collect(); + Self::from(v) + } +} + // Serde keep backward compatibility with old Vec> format #[cfg(feature = "serde")] impl serde::Serialize for Witness { @@ -858,6 +865,39 @@ mod test { assert_eq!(json, r#"["007b4b","0206030708"]"#); } + #[test] + fn test_witness_from_iterator() { + let bytes1 = [1u8, 2, 3]; + let bytes2 = [4u8, 5]; + let bytes3 = [6u8, 7, 8, 9]; + let data = [&bytes1[..], &bytes2[..], &bytes3[..]]; + + // Use FromIterator directly + let witness1 = Witness::from_iter(data); + + // Create a witness manually for comparison + let mut witness2 = Witness::new(); + for item in &data { + witness2.push(item); + } + assert_eq!(witness1, witness2); + assert_eq!(witness1.len(), witness2.len()); + assert_eq!(witness1.to_vec(), witness2.to_vec()); + + // Test with collect + let bytes4 = [0u8, 123, 75]; + let bytes5 = [2u8, 6, 3, 7, 8]; + let data = [bytes4.to_vec(), bytes5.to_vec()]; + let witness3: Witness = data.iter().collect(); + assert_eq!(witness3.len(), 2); + assert_eq!(witness3.to_vec(), data); + + // Test with empty iterator + let empty_data: Vec> = vec![]; + let witness4: Witness = empty_data.iter().collect(); + assert!(witness4.is_empty()); + } + #[cfg(feature = "hex")] #[test] fn test_from_hex() {