use std::collections::hash_map::DefaultHasher;
use std::hash::{Hash, Hasher};
use chrono::{DateTime, Utc};
#[derive(Clone, Debug, Hash, PartialEq)]
pub struct Block<T: Hash> {
pub id: u64,
pub value: T,
pub previous_id: u64,
pub timestamp: DateTime<Utc>,
}
impl<T: Hash> Block<T> {
pub fn new(id: u64, value: T, previous_id: u64) -> Block<T> {
let timestamp = Utc::now();
Block {
id,
value,
previous_id,
timestamp,
}
}
pub fn is_trusty_for(&self, other: &Block<T>) -> bool {
self.previous_id == gen_id(other)
}
pub fn next(&self, value: T) -> Block<T> {
let id = self.id + 1;
let previous_id = gen_id(&self);
let timestamp = Utc::now();
Block {
id,
value,
previous_id,
timestamp,
}
}
}
fn gen_id<T: Hash>(t: &T) -> u64 {
let mut sip = DefaultHasher::default();
t.hash(&mut sip);
sip.finish()
}