1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
use std::io::{BufReader, BufRead, Seek, Cursor};
use std::fs::File;
use std::path::Path;

use types::Result;

/// Provides several convenience functions for loading metadata from various sources.
pub trait LoadableMetadata: Sized {
    /// Loads the implementing type from the given buffered input stream.
    fn load<R: ?Sized + BufRead>(r: &mut R) -> Result<Self>;

    /// Loads the implementing type from the given buffered and seekable input stream.
    ///
    /// Delegates to `LoadableMetadata::load()` method by default. Implementations
    /// may override this behavior if their respective image format may be parsed
    /// more efficiently with seeking.
    fn load_from_seek<R: ?Sized + BufRead + Seek>(r: &mut R) -> Result<Self> {
        LoadableMetadata::load(r)
    }

    /// Loads the implementing type from a file specified by the given path.
    ///
    /// Delegates to `LoadableMetadata::load_from_seek()` method by default.
    #[inline]
    fn load_from_file<P: AsRef<Path>>(path: P) -> Result<Self> {
        let mut f = BufReader::new(try!(File::open(path)));
        LoadableMetadata::load_from_seek(&mut f)
    }

    /// Loads the implementing type from an in-memory buffer.
    ///
    /// Delegates to `LoadableMetadata::load_from_seek()` method by default.
    #[inline]
    fn load_from_buf(buf: &[u8]) -> Result<Self> {
        LoadableMetadata::load_from_seek(&mut Cursor::new(buf))
    }
}