actiondb 0.3.0

A safe and efficient unstructured text (log) parsing library.
use super::trie::ParserTrie;
use super::pattern::file;
use super::pattern::source::PatternSource;
use super::matcher::builder;
use super::matcher::Matcher;

use std::path;
use std::ffi;

#[derive(Clone, Debug)]
pub struct Factory;

impl Factory {
    pub fn from_json_file(pattern_file_path: &str) -> Result<Box<Matcher>, builder::BuildError> {
        let file = try!(file::SerializedPatternFile::open(pattern_file_path));
        Factory::drain_into(&mut file.into_iter())
    }

    pub fn from_file(pattern_file_path: &str) -> Result<Box<Matcher>, builder::BuildError> {
        let path = path::Path::new(pattern_file_path);
        match path.extension() {
            Some(extension) => {
                Factory::from_file_based_on_extension(extension, pattern_file_path)
            },
            None => Err(builder::BuildError::UnsupportedFileExtension)
        }
    }

    fn from_file_based_on_extension(extension: &ffi::OsStr, pattern_file_path: &str) -> Result<Box<Matcher>, builder::BuildError> {
        match try!(extension.to_str().ok_or(builder::BuildError::NotUtf8FileName)) {
            "json" => Factory::from_json_file(pattern_file_path),
            _ => Err(builder::BuildError::UnsupportedFileExtension)
        }
    }

    pub fn drain_into(source: &mut PatternSource) -> Result<Box<Matcher>, builder::BuildError> {
        let mut trie = ParserTrie::new();
        try!(builder::Builder::drain_into(source, &mut trie));
        Ok(Box::new(trie))
    }
}