89 lines
3.0 KiB
Rust
89 lines
3.0 KiB
Rust
use crate::{BigDirectoryNode, DirectoryEntry, DirectoryNode, MerkleNode, MerkleTree, NodeHash};
|
|
use sha2::{Digest, Sha256};
|
|
|
|
const CHUNK: u8 = 0;
|
|
const DIRECTORY: u8 = 1;
|
|
const BIG: u8 = 2;
|
|
const BIGDIRECTORY: u8 = 3;
|
|
|
|
pub fn parse_received_datum(
|
|
recevied_datum: Vec<u8>,
|
|
datum_length: usize,
|
|
) -> Option<([u8; 32], MerkleNode)> {
|
|
let hash_name: [u8; 32] = recevied_datum[..32].try_into().expect("error");
|
|
let sigstart = datum_length - 64;
|
|
let value = &recevied_datum[32..sigstart];
|
|
let value_slice = value.to_vec();
|
|
let datum_type = value_slice[0];
|
|
match datum_type {
|
|
CHUNK => Some((
|
|
hash_name,
|
|
MerkleNode::Chunk(crate::ChunkNode { data: value_slice }),
|
|
)),
|
|
DIRECTORY => {
|
|
let nb_entries = value_slice[1];
|
|
let mut dir_entries = Vec::new();
|
|
let mut offset = 1 as usize;
|
|
for i in 0..nb_entries {
|
|
offset = (offset as u8 + 64 * i) as usize;
|
|
let name = &recevied_datum[offset..offset + 32];
|
|
let mut hash = [0u8; 32];
|
|
hash.copy_from_slice(&recevied_datum[offset + 32..offset + 64]);
|
|
// envoyer un datum request
|
|
dir_entries.push(DirectoryEntry {
|
|
filename: name.try_into().expect("incorrect size"),
|
|
content_hash: hash,
|
|
});
|
|
}
|
|
|
|
let current = DirectoryNode::new(dir_entries);
|
|
match current {
|
|
Ok(current_node) => Some((hash_name, MerkleNode::Directory(current_node))),
|
|
Err(e) => {
|
|
println!("{}", e);
|
|
None
|
|
}
|
|
}
|
|
}
|
|
BIG => {
|
|
let chlidren: Vec<NodeHash> = Vec::new();
|
|
Some((
|
|
hash_name,
|
|
MerkleNode::Big(crate::BigNode {
|
|
children_hashes: chlidren,
|
|
}),
|
|
))
|
|
/*let chlidren: Vec<NodeHash> = Vec::new();
|
|
tree.data.insert(
|
|
hash_name,
|
|
MerkleNode::Big(crate::BigNode {
|
|
children_hashes: chlidren,
|
|
}),
|
|
);*/
|
|
}
|
|
BIGDIRECTORY => {
|
|
let nb_entries = value_slice[1];
|
|
let mut dir_entries = Vec::new();
|
|
let mut offset = 1 as usize;
|
|
for i in 0..nb_entries {
|
|
offset = (offset as u8 + 64 * i) as usize;
|
|
let name = &recevied_datum[offset..offset + 32];
|
|
let mut hash = [0u8; 32];
|
|
hash.copy_from_slice(&recevied_datum[offset + 32..offset + 64]);
|
|
// envoyer un datum request
|
|
dir_entries.push(hash);
|
|
}
|
|
|
|
let current = BigDirectoryNode::new(dir_entries);
|
|
match current {
|
|
Ok(current_node) => Some((hash_name, MerkleNode::BigDirectory(current_node))),
|
|
Err(e) => {
|
|
println!("{}", e);
|
|
None
|
|
}
|
|
}
|
|
}
|
|
_ => None,
|
|
}
|
|
}
|