use bencode::Bencodable;
use bencode::BencodeError;
pub struct BencodeString {
pub length: i64,
pub contents: Vec<u8>
}
impl Bencodable<String> for BencodeString
{
fn to_bencode_string(&self) -> String {
let final_length = self.length.to_string();
let final_contents = self.extract_content();
let mut final_string = String::new();
final_string.push_str(&final_length);
final_string.push(':');
final_string.push_str(&final_contents);
final_string
}
fn from_bencode_string(str: &'static str) -> Result<BencodeString,BencodeError> {
let mut split_string = (&str).split(':');
let pos_count = split_string.next();
let pos_contents = split_string.next();
if pos_count.is_none() || pos_contents.is_none() || split_string.count() != 0 {
Err(BencodeError::ParseError("string was encoded incorrectly and could not be converted"))
} else {
let actual_count = i64::from_str_radix(pos_count.unwrap(), 10);
if actual_count.is_err() {
Err(BencodeError::ParseError("count was unable to be parsed correctly"))
} else {
let final_count: i64 = actual_count.unwrap();
let mut final_contents: Vec<u8> = Vec::new();
for c in pos_contents.unwrap().chars() {
final_contents.push(c as u8);
}
Ok(BencodeString {
length: final_count,
contents: final_contents.clone()
})
}
}
}
fn extract_content(&self) -> String
{
let result = String::from_utf8(self.contents.clone());
if result.is_err() {
panic!("oxidation_bencode error: bytes in string are not ASCII or are incorrect");
} else {
result.unwrap()
}
}
}