mod decode;
mod encode;
mod util;
pub use bytes::Bytes;
pub use self::decode::decode;
pub use self::encode::encode;
pub use self::util::*;
use std::fmt;
#[derive(Debug, Clone, PartialEq, Eq)]
pub enum Bencode {
Bytes(Bytes),
Integer(i64),
List(Vec<Bencode>),
Dict(Vec<(Bytes, Bencode)>),
}
impl From<&[u8]> for Bencode {
fn from(value: &[u8]) -> Self {
Bencode::Bytes(Bytes::copy_from_slice(value))
}
}
impl From<&str> for Bencode {
fn from(value: &str) -> Self {
Bencode::Bytes(Bytes::copy_from_slice(value.as_bytes()))
}
}
impl From<String> for Bencode {
fn from(value: String) -> Self {
Bencode::Bytes(Bytes::from(value))
}
}
impl From<i64> for Bencode {
fn from(value: i64) -> Self {
Bencode::Integer(value)
}
}
impl<T: Into<Bencode>> From<Vec<T>> for Bencode {
fn from(value: Vec<T>) -> Self {
Bencode::List(value.into_iter().map(Into::into).collect())
}
}
impl fmt::Display for Bencode {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Bencode::Bytes(b) => write!(f, "b{:?}", b),
Bencode::Integer(i) => write!(f, "i{}", i),
Bencode::List(items) => {
write!(f, "[")?;
for (i, v) in items.iter().enumerate() {
if i > 0 {
write!(f, ", ")?;
}
write!(f, "{}", v)?;
}
write!(f, "]")
}
Bencode::Dict(entries) => {
write!(f, "{{")?;
for (i, (k, v)) in entries.iter().enumerate() {
if i > 0 {
write!(f, ", ")?;
}
write!(f, "{:?}: {}", k, v)?;
}
write!(f, "}}")
}
}
}
}