btpeer 0.10.0

Simple CLI tool and library to get peers from TCP/HTTP and UDP BitTorrent trackers
Documentation
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)
    }
}