bitcoin/p2p/
message_bloom.rs1use io::{Read, Write};
9
10use crate::consensus::{encode, Decodable, Encodable, ReadExt};
11use crate::internal_macros::impl_consensus_encoding;
12
13#[derive(Clone, PartialEq, Eq, Debug)]
15pub struct FilterLoad {
16 pub filter: Vec<u8>,
18 pub hash_funcs: u32,
20 pub tweak: u32,
22 pub flags: BloomFlags,
24}
25
26impl_consensus_encoding!(FilterLoad, filter, hash_funcs, tweak, flags);
27
28#[derive(Debug, Copy, Clone, Eq, PartialEq)]
30pub enum BloomFlags {
31 None,
33 All,
35 PubkeyOnly,
37}
38
39impl Encodable for BloomFlags {
40 fn consensus_encode<W: Write + ?Sized>(&self, w: &mut W) -> Result<usize, io::Error> {
41 w.write_all(&[match self {
42 BloomFlags::None => 0,
43 BloomFlags::All => 1,
44 BloomFlags::PubkeyOnly => 2,
45 }])?;
46 Ok(1)
47 }
48}
49
50impl Decodable for BloomFlags {
51 fn consensus_decode<R: Read + ?Sized>(r: &mut R) -> Result<Self, encode::Error> {
52 Ok(match r.read_u8()? {
53 0 => BloomFlags::None,
54 1 => BloomFlags::All,
55 2 => BloomFlags::PubkeyOnly,
56 _ => return Err(encode::Error::ParseFailed("unknown bloom flag")),
57 })
58 }
59}
60
61#[derive(Clone, PartialEq, Eq, Debug)]
63pub struct FilterAdd {
64 pub data: Vec<u8>,
66}
67
68impl_consensus_encoding!(FilterAdd, data);