#[derive(RustcEncodable, RustcDecodable, PartialEq, Eq, PartialOrd, Ord, Clone)]
pub struct ChunkDetails {
pub chunk_num: u32,
pub hash: Vec<u8>,
pub pre_hash: Vec<u8>,
pub source_size: u64
}
impl ChunkDetails {
pub fn new() -> ChunkDetails {
ChunkDetails {
chunk_num: 0,
hash: vec![],
pre_hash: vec![],
source_size: 0
}
}
}
#[derive(RustcEncodable, RustcDecodable, PartialEq, Eq, PartialOrd, Ord, Clone)]
pub enum DataMap {
Chunks(Vec<ChunkDetails>),
Content(Vec<u8>),
None
}
impl DataMap {
pub fn len(&self) -> u64 {
match *self {
DataMap::Chunks(ref chunks) => DataMap::chunks_size(chunks),
DataMap::Content(ref content) => content.len() as u64,
DataMap::None => 0
}
}
pub fn get_chunks(&self) -> Vec<ChunkDetails> {
match *self {
DataMap::Chunks(ref chunks) => chunks.to_vec(),
_ => panic!("no chunks")
}
}
pub fn get_sorted_chunks(&self) -> Vec<ChunkDetails> {
match *self {
DataMap::Chunks(ref chunks) => {
let mut result = chunks.to_vec();
DataMap::chunks_sort(&mut result);
result
},
_ => panic!("no chunks")
}
}
pub fn has_chunks(&self) -> bool {
match *self {
DataMap::Chunks(ref chunks) => DataMap::chunks_size(chunks) > 0,
_ => false,
}
}
fn chunks_size(chunks: &[ChunkDetails]) -> u64 {
chunks.iter().fold(0, |acc, chunk| acc + chunk.source_size)
}
fn chunks_sort(chunks: &mut [ChunkDetails]) {
chunks.sort_by(|a, b| a.chunk_num.cmp(&b.chunk_num));
}
}
#[test]
fn dummy() {
}