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: ACK6bd7dc6980
apoelstra: ACK 6bd7dc69802ad809492fe44d8d87c4b287f93676; successfully ran local tests Tree-SHA512: 660196c5027fb9270f9ae5c4e08eab6baa2afbdf19a2220b4777303f71f6802bd7ed5e1512af8ee14654b1249ec22606ea817951befbe85b13f9f285b3ebae12
This commit is contained in:
commit
9c80eb077a
|
@ -403,6 +403,13 @@ impl<'a> IntoIterator for &'a Witness {
|
|||
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
|
||||
#[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<u8>> = vec![];
|
||||
let witness4: Witness = empty_data.iter().collect();
|
||||
assert!(witness4.is_empty());
|
||||
}
|
||||
|
||||
#[cfg(feature = "hex")]
|
||||
#[test]
|
||||
fn test_from_hex() {
|
||||
|
|
Loading…
Reference in New Issue