actiondb 0.7.0

A safe and efficient unstructured text (log) parsing library.
Documentation
use serde;

use super::PatternFile;
use matcher::pattern::Pattern;

impl serde::de::Deserialize for PatternFile {
    fn deserialize<D>(deserializer: &mut D) -> Result<PatternFile, D::Error>
        where D: serde::de::Deserializer
    {
        deserializer.deserialize_struct("File", &[], FileVisitor)
    }
}

enum Field {
    PATTERNS,
}

impl serde::Deserialize for Field {
    fn deserialize<D>(deserializer: &mut D) -> Result<Field, D::Error>
        where D: serde::de::Deserializer
    {
        struct FieldVisitor;

        impl serde::de::Visitor for FieldVisitor {
            type Value = Field;

            fn visit_str<E>(&mut self, value: &str) -> Result<Field, E>
                where E: serde::de::Error
            {
                match value {
                    "patterns" => Ok(Field::PATTERNS),
                    _ => Err(serde::de::Error::custom(format!("Unexpected field: {}", value))),
                }
            }
        }

        deserializer.deserialize(FieldVisitor)
    }
}

struct FileVisitor;

impl serde::de::Visitor for FileVisitor {
    type Value = PatternFile;

    fn visit_map<V>(&mut self, mut visitor: V) -> Result<PatternFile, V::Error>
        where V: serde::de::MapVisitor
    {
        let mut patterns: Option<Vec<Pattern>> = None;

        while let Some (field) = try!(visitor.visit_key()) {
            match field {
                Field::PATTERNS => patterns = Some(try!(visitor.visit_value()))
            }
        }

        let patterns_final = match patterns {
            Some(patterns) => patterns,
            None => try!(visitor.missing_field("patterns")),
        };

        try!(visitor.end());

        Ok(PatternFile { patterns: patterns_final })
    }
}