diff options
Diffstat (limited to 'lib/src/lib.rs')
-rw-r--r-- | lib/src/lib.rs | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/lib/src/lib.rs b/lib/src/lib.rs new file mode 100644 index 0000000..666c727 --- /dev/null +++ b/lib/src/lib.rs @@ -0,0 +1,65 @@ +extern crate phf; +extern crate flate2; + +use std::borrow::{Borrow, Cow}; +use std::io::{self, Cursor, Error, ErrorKind, Read}; + +use flate2::FlateReadExt; + +pub enum Compression { + None, + Gzip, +} + +/// Runtime access to the included files +pub struct Files { + /// **Do not access this field, it is only public to allow for code generation!** + pub files: phf::Map<&'static str, (Compression, &'static [u8])>, +} + +#[cfg(windows)] +fn as_key(path: &str) -> Cow<str> { + Cow::Owned(path.replace("\\", "/")) +} + +#[cfg(not(windows))] +fn as_key(path: &str) -> Cow<str> { + Cow::Borrowed(path) +} + +impl Files { + pub fn available(&self, path: &str) -> bool { + self.files.contains_key(path) + } + + pub fn get(&self, path: &str) -> io::Result<Cow<'static, [u8]>> { + let key = as_key(path); + match self.files.get(key.borrow() as &str) { + Some(b) => { + match b.0 { + Compression::None => Ok(Cow::Borrowed(b.1)), + Compression::Gzip => { + let mut r = try!(Cursor::new(b.1).gz_decode()); + let mut v = Vec::new(); + try!(r.read_to_end(&mut v)); + Ok(Cow::Owned(v)) + } + } + } + None => Err(Error::new(ErrorKind::NotFound, "Key not found")), + } + } + + pub fn read(&self, path: &str) -> io::Result<Box<Read>> { + let key = as_key(path); + match self.files.get(key.borrow() as &str) { + Some(b) => { + match b.0 { + Compression::None => Ok(Box::new(Cursor::new(b.1))), + Compression::Gzip => Ok(Box::new(try!(Cursor::new(b.1).gz_decode()))), + } + } + None => Err(Error::new(ErrorKind::NotFound, "Key not found")), + } + } +} |