use bencode::Bencodable;
use bencode::BencodeError;
pub struct BencodeInteger
{
pub integer: u64
}
impl Bencodable<u64> for BencodeInteger
{
fn to_bencode_string(&self) -> String
{
let int = self.integer.to_string();
let mut final_string = String::new();
final_string.push('i');
final_string.push_str(&int);
final_string.push('e');
final_string
}
fn from_bencode_string(str: &'static str) -> Result<BencodeInteger, BencodeError> {
if !str.starts_with("i") || !str.ends_with("e") {
Err(BencodeError::ParseError("integer string is not delimited correctly"))
} else {
let stripped_string = str.trim_matches(|c| c == 'i' || c == 'e');
if (stripped_string.starts_with("0") && stripped_string.chars().count() != 1) || stripped_string.starts_with("-0") {
Err(BencodeError::ParseError("integer is incorrectly formatted with leading zero"))
} else {
let final_integer = u64::from_str_radix(stripped_string, 10);
if final_integer.is_err() {
Err(BencodeError::ParseError("integer string could not be converted into a number"))
} else {
Ok(BencodeInteger {
integer: final_integer.unwrap()
})
}
}
}
}
fn extract_content(&self) -> u64
{
self.integer
}
}