diff --git a/libimagref/src/hasher.rs b/libimagref/src/hasher.rs new file mode 100644 index 00000000..b2970837 --- /dev/null +++ b/libimagref/src/hasher.rs @@ -0,0 +1,48 @@ +use std::path::PathBuf; +use std::io::Read; + +use error::RefErrorKind as REK; +use error::MapErrInto; + +use crypto::sha1::Sha1; +use crypto::digest::Digest; + +use result::Result; + +/// The Hasher trait is used to implement custom hashing functions for the ref library. +/// This means that one can define how the hash of a reference is constructed from the content of +/// the file to ref to. +pub trait Hasher { + + fn hash_name(&self) -> &'static str; + fn create_hash(&mut self, pb: &PathBuf, contents: &mut R) -> Result; + +} + +pub struct DefaultHasher { + hasher: Sha1, +} + +impl DefaultHasher { + + pub fn new() -> DefaultHasher { + DefaultHasher { hasher: Sha1::new() } + } + +} + +impl Hasher for DefaultHasher { + + fn hash_name(&self) -> &'static str { + "default" + } + + fn create_hash(&mut self, _: &PathBuf, contents: &mut R) -> Result { + let mut s = String::new(); + try!(contents.read_to_string(&mut s).map_err_into(REK::IOError)); + self.hasher.input_str(&s[..]); + Ok(self.hasher.result_str()) + } + +} + diff --git a/libimagref/src/lib.rs b/libimagref/src/lib.rs index eac8842c..79be27bd 100644 --- a/libimagref/src/lib.rs +++ b/libimagref/src/lib.rs @@ -29,6 +29,7 @@ module_entry_path_mod!("ref", "0.2.0"); pub mod error; pub mod flags; +pub mod hasher; pub mod lister; pub mod reference; pub mod result; diff --git a/libimagref/src/reference.rs b/libimagref/src/reference.rs index 6e38aa50..9dc96e00 100644 --- a/libimagref/src/reference.rs +++ b/libimagref/src/reference.rs @@ -518,11 +518,3 @@ impl<'a> Into> for Ref<'a> { } -fn hash_file_contents(f: &mut File) -> String { - let mut hasher = Sha1::new(); - let mut s = String::new(); - f.read_to_string(&mut s); - hasher.input_str(&s[..]); - hasher.result_str() -} -