handlebars/
sources.rs

1use std::fs::File;
2use std::io::{BufReader, Error as IOError, ErrorKind, Read};
3use std::path::PathBuf;
4
5pub(crate) trait Source {
6    type Item;
7    type Error;
8
9    fn load(&self) -> Result<Self::Item, Self::Error>;
10}
11
12pub(crate) struct FileSource {
13    path: PathBuf,
14}
15
16impl FileSource {
17    pub(crate) fn new(path: PathBuf) -> FileSource {
18        FileSource { path }
19    }
20}
21
22impl Source for FileSource {
23    type Item = String;
24    type Error = IOError;
25
26    fn load(&self) -> Result<Self::Item, Self::Error> {
27        let mut reader = BufReader::new(File::open(&self.path)?);
28
29        let mut buf = String::new();
30        reader.read_to_string(&mut buf)?;
31
32        Ok(buf)
33    }
34}
35
36pub(crate) struct LazySource<F: Fn() -> Option<String>> {
37    loader: F,
38}
39
40impl<F: Fn() -> Option<String>> LazySource<F> {
41    pub(crate) fn new(loader: F) -> LazySource<F> {
42        LazySource { loader }
43    }
44}
45
46impl<F: Fn() -> Option<String>> Source for LazySource<F> {
47    type Item = String;
48    type Error = IOError;
49
50    fn load(&self) -> Result<Self::Item, Self::Error> {
51        (self.loader)().ok_or(IOError::new(ErrorKind::Other, "Source load error"))
52    }
53}