1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
use serde::bytes::ByteBuf;
use std::collections::BTreeMap;

#[derive(PartialOrd, Eq, Ord, PartialEq, Clone, Debug, Serialize, Deserialize)]
pub enum Bencode {
    ByteString(ByteBuf),
    Integer(i64),
    List(Vec<Bencode>),
    Dict(BTreeMap<Bencode, Bencode>)
}

impl From<i64> for Bencode {
    fn from(i: i64) -> Bencode {
        Bencode::Integer(i)
    }
}

impl From<String> for Bencode {
    fn from(s: String) -> Bencode {
        Bencode::ByteString(s.into_bytes().into())
    }
}

impl<'a> From<&'a str> for Bencode {
    fn from(s: &str) -> Bencode {
        Bencode::ByteString(s.as_bytes().to_vec().into())
    }
}

impl From<Vec<u8>> for Bencode {
    fn from(bs: Vec<u8>) -> Bencode {
        Bencode::ByteString(bs.into())
    }
}

impl From<Vec<Bencode>> for Bencode {
    fn from(l: Vec<Bencode>) -> Bencode {
        Bencode::List(l.clone())
    }
}

impl From<BTreeMap<Vec<u8>, Bencode>> for Bencode {
    fn from(m: BTreeMap<Vec<u8>, Bencode>) -> Bencode {
        let mut n: BTreeMap<Bencode, Bencode> = BTreeMap::new();
        for (key, value) in m.iter() {
            n.insert(key.clone().into(), value.clone());
        }
        Bencode::Dict(n)
    }
}