Merge rust-bitcoin/rust-bitcoin#4365: Implement FromIterator for Witness

6bd7dc6980 feat(witness): implement FromIterator for Witness with unit test (aagbotemi)

Pull request description:

  This PR implements the FromIterator trait for the Witness struct, addressing issue #4351.

  Changes:
  - Added FromIterator<T: AsRef<[u8]>> implementation for Witness, allowing for convenient creation of Witness from iterators
  - Added unit test to verify the implementation works correctly

  This PR fixes #4351

ACKs for top commit:
  tcharding:
    ACK 6bd7dc6980
  apoelstra:
    ACK 6bd7dc69802ad809492fe44d8d87c4b287f93676; successfully ran local tests

Tree-SHA512: 660196c5027fb9270f9ae5c4e08eab6baa2afbdf19a2220b4777303f71f6802bd7ed5e1512af8ee14654b1249ec22606ea817951befbe85b13f9f285b3ebae12
This commit is contained in:
merge-script 2025-04-22 16:48:23 +00:00
commit 9c80eb077a
No known key found for this signature in database
GPG Key ID: C588D63CE41B97C1
1 changed files with 40 additions and 0 deletions

View File

@ -403,6 +403,13 @@ impl<'a> IntoIterator for &'a Witness {
fn into_iter(self) -> Self::IntoIter { self.iter() } fn into_iter(self) -> Self::IntoIter { self.iter() }
} }
impl<T: AsRef<[u8]>> FromIterator<T> for Witness {
fn from_iter<I: IntoIterator<Item = T>>(iter: I) -> Self {
let v: Vec<Vec<u8>> = iter.into_iter().map(|item| Vec::from(item.as_ref())).collect();
Self::from(v)
}
}
// Serde keep backward compatibility with old Vec<Vec<u8>> format // Serde keep backward compatibility with old Vec<Vec<u8>> format
#[cfg(feature = "serde")] #[cfg(feature = "serde")]
impl serde::Serialize for Witness { impl serde::Serialize for Witness {
@ -858,6 +865,39 @@ mod test {
assert_eq!(json, r#"["007b4b","0206030708"]"#); 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<u8>> = vec![];
let witness4: Witness = empty_data.iter().collect();
assert!(witness4.is_empty());
}
#[cfg(feature = "hex")] #[cfg(feature = "hex")]
#[test] #[test]
fn test_from_hex() { fn test_from_hex() {