use crate::peer::Buffer;
use bendy::decoding::{Error, FromBencode, Object};
#[derive(Debug, Default)]
pub struct I2p {
pub complete: u32,
pub incomplete: u32,
pub interval: u32,
pub peers: Buffer,
}
impl FromBencode for I2p {
fn decode_bencode_object(object: Object) -> Result<Self, Error> {
let mut dict = object.try_into_dictionary()?;
let mut response = Self::default();
while let Some(pair) = dict.next_pair()? {
match pair {
(b"interval", value) => {
response.interval = value
.try_into_integer()
.map_err(Error::malformed_content)?
.parse()
.map_err(Error::malformed_content)?
}
(b"complete", value) => {
response.complete = value
.try_into_integer()
.map_err(Error::malformed_content)?
.parse()
.map_err(Error::malformed_content)?
}
(b"incomplete", value) => {
response.incomplete = value
.try_into_integer()
.map_err(Error::malformed_content)?
.parse()
.map_err(Error::malformed_content)?
}
(b"peers", value) => {
response.peers = Buffer::from_peers_i2p(
value.try_into_bytes().map_err(Error::malformed_content)?,
)
.map_err(|e| {
Error::malformed_content(std::io::Error::new(
std::io::ErrorKind::InvalidData,
e,
))
})?;
}
_ => continue,
}
}
Ok(response)
}
}